hdu 3061 最大权闭合子图

 

属于模板题吧。。。

 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 }
View Code

 

posted @ 2015-05-26 15:00  idy002  阅读(170)  评论(0编辑  收藏  举报