hdoj Battle 解法最大权闭包

  1 #include  " stdio.h "
  2 #include  " string.h "
  3 #include  < queue >
  4 using   namespace  std;
  5 #define  N 1000
  6 #define  M 1000000
  7 #define  INF 1000000000
  8
  9 int  f[N],h[N],hv[N];
 10 int  c[N][N];
 11 int  n,m,src,des;
 12 int  augc;
 13 int  flow;
 14 int  sum;
 15
 16 void  Insert( int  fr, int  to, int  d)
 17 {
 18     c[fr][to] = d;
 19 }

 20
 21 bool  aug( int  v)
 22 {
 23      int  i,minh = n - 1 ;
 24      int  augco = augc;
 25      if (v == des)
 26      {
 27         flow += augc;
 28          return   true ;
 29     }

 30      for (i = 0 ;i < n;i ++ )
 31      {
 32          if (c[v][i] > 0 )
 33          {
 34              if (h[v] == h[i] + 1 )
 35              {
 36                  if (augc > c[v][i])
 37                     augc = c[v][i];
 38                  if (aug(i))  break ;
 39                  if (h[src] >= n) 
 40                  {
 41                      return   false ;
 42                 }

 43                 augc = augco;
 44             }

 45              if (minh > h[i])
 46                 minh = h[i];
 47         }

 48     }

 49      if (i == n)
 50      {
 51         hv[h[v]] -- ;
 52          if (hv[h[v]] == 0 ) h[src] = n;
 53         h[v] = minh + 1 ;
 54         hv[h[v]] ++ ;
 55          return   false ;
 56     }

 57      else
 58      {
 59         c[v][i] -= augc;
 60         c[i][v] += augc;
 61          return   true ;
 62     }

 63 }

 64 void  SAP()
 65 {
 66     memset(h, 0 , sizeof (h));
 67     memset(hv, 0 , sizeof (hv));
 68     hv[ 0 ] = n;
 69     flow = 0 ;
 70      while (h[src] < n)
 71      {
 72         augc = INF;
 73         aug(src);
 74     }

 75     printf( " %d\n " ,sum - flow);
 76 }

 77 int  main()
 78 {
 79      int  i,m,a,b;
 80      while (scanf( " %d %d " , & n, & m) != EOF)
 81      {
 82         memset(c, 0 , sizeof (c));
 83         src = 0 ;
 84         des = n + 1 ;
 85         sum = 0 ;
 86          for (i = 1 ;i <= n;i ++ )
 87          {
 88             scanf( " %d " , & f[i]);
 89              if (f[i] > 0 )
 90              {
 91                 Insert(src,i,f[i]);
 92                 sum += f[i];
 93             }

 94              else
 95              {
 96                 Insert(i,des, - f[i]);
 97             }

 98         }

 99          for (i = 0 ;i < m;i ++ )
100          {
101             scanf( " %d %d " , & a, & b);
102             Insert(a,b,INF);
103         }

104         n += 2 ;
105         SAP();
106     }

107      return   0 ;
108 }

109