标签:
属于模板题吧。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #define min(a,b) ((a)<(b)?(a):(b)) 5 #define oo 0x3f3f3f3f 6 #define N 610 7 using namespace std; 8 9 struct Edge { 10 int u, v, f; 11 Edge( int u, int v, int f ):u(u),v(v),f(f){} 12 }; 13 struct Dinic { 14 int src, dst; 15 vector<Edge> edge; 16 vector<int> g[N]; 17 int dep[N], cur[N], qu[N], bg, ed; 18 19 void init( int n, int src, int dst ) { 20 this->src = src; 21 this->dst = dst; 22 for( int i=1; i<=n; i++ ) 23 g[i].clear(); 24 edge.clear(); 25 } 26 void adde( int u, int v, int f ) { 27 g[u].push_back( edge.size() ); 28 edge.push_back( Edge(u,v,f) ); 29 g[v].push_back( edge.size() ); 30 edge.push_back( Edge(v,u,0) ); 31 } 32 bool bfs() { 33 memset( dep, 0, sizeof(dep) ); 34 qu[bg=ed=1] = src; 35 dep[src] = 1; 36 while( bg<=ed ) { 37 int u=qu[bg++]; 38 for( int t=0; t<g[u].size(); t++ ) { 39 Edge &e = edge[g[u][t]]; 40 if( e.f && !dep[e.v] ) { 41 dep[e.v] = dep[e.u]+1; 42 qu[++ed] = e.v; 43 } 44 } 45 } 46 return dep[dst]; 47 } 48 int dfs( int u, int a ) { 49 if( u==dst || a==0 ) return a; 50 int remain=a, past=0, na; 51 for( int &t=cur[u]; t<g[u].size(); t++ ) { 52 Edge &e = edge[g[u][t]]; 53 Edge &ve = edge[g[u][t]^1]; 54 if( e.f && dep[e.v]==dep[e.u]+1 && (na=dfs(e.v,min(remain,e.f))) ) { 55 remain -= na; 56 past += na; 57 e.f -= na; 58 ve.f += na; 59 if( !remain ) break; 60 } 61 } 62 return past; 63 } 64 int maxflow() { 65 int flow = 0; 66 while( bfs() ) { 67 memset( cur, 0, sizeof(cur) ); 68 flow += dfs(src,oo); 69 } 70 return flow; 71 } 72 }D; 73 74 int n, m; 75 int src, dst; 76 int wght[N], sum; 77 78 int main() { 79 while( scanf("%d%d",&n,&m)==2 ) { 80 src = n+1, dst = n+2; 81 D.init( n+2, src, dst ); 82 sum = 0; 83 for( int i=1; i<=n; i++ ) { 84 scanf( "%d", wght+i ); 85 if( wght[i]>0 ) 86 D.adde( src, i, wght[i] ), sum += wght[i]; 87 if( wght[i]<0 ) 88 D.adde( i, dst, -wght[i] ); 89 } 90 for( int i=1,u,v; i<=m; i++ ) { 91 scanf( "%d%d", &u, &v ); 92 D.adde( u, v, oo ); 93 } 94 printf( "%d\n", sum - D.maxflow() ); 95 } 96 }
标签:
原文地址:http://www.cnblogs.com/idy002/p/4530638.html