Dinic+maxflow
题意:找这样一种边的个数,就是增加该边的容量,可以使得最大流变大
题意:找这样一种边的个数,就是增加该边的容量,可以使得最大流变大
思路:求maxflow,再枚举流量为0的边,增加容量,看是否能找到增广路径。
/* Dinic+maxflow 题意:找这样一种边的个数,就是增加该边的容量,可以使得最大流变大 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<stack> #include<set> #include<math.h> using namespace std; typedef long long int64; //typedef __int64 int64; typedef pair<int64,int64> PII; #define MP(a,b) make_pair((a),(b)) const int maxn = 505; const int maxm = 5005; const int inf = 0x3f3f3f3f; const double pi=acos(-1.0); const double eps = 1e-8; struct Edge{ int u,v,next,val; bool flag; }edge[ maxm<<2 ]; int cnt,head[ maxn ]; int vis[ maxn ]; int lev[ maxn ]; int q[ maxn<<4 ]; void init(){ cnt = 0; memset( head,-1,sizeof( head ) ); } void addedge( int a,int b,int c ){ edge[ cnt ].u = a; edge[ cnt ].v = b; edge[ cnt ].val = c; edge[ cnt ].next = head[ a ]; if( cnt%2==0 ) edge[ cnt ].flag = true; else edge[ cnt ].flag = false; head[ a ] = cnt ++; } bool bfs( int n,int start,int end ){ int head2 = 0,tail2 = 0; q[ tail2++ ] = start; memset( lev,-1,sizeof( lev ) ); lev[ start ] = 0; while( head2<tail2 ){ int u = q[ head2++ ]; for( int i=head[u];i!=-1;i=edge[i].next ){ int v = edge[i].v; if( edge[i].val>0&&lev[v]==-1 ){ lev[v] = lev[u]+1; q[ tail2++ ] = v; } } } if( lev[ end ]==-1 ) return false; else return true; } int Dinic( int n,int start,int end ){ int maxflow = 0; while( true ){ if( bfs(n,start,end )==false ) break; int id = start; int tail = 0; while( true ){ if( id==end ){ int flow = inf; int flag = -1; for( int i=0;i<tail;i++ ){ if( edge[ q[i] ].val<flow ){ flow = edge[ q[i] ].val ; flag = i; } } for( int i=0;i<tail;i++ ){ edge[ q[i] ].val -= flow; edge[ q[i]^1 ].val += flow; } if( flag!=-1 ){ maxflow += flow; tail = flag; id = edge[ q[flag] ].u; } else return inf; } id = head[ id ]; while( id!=-1 ){ if( edge[id].val>0&&lev[edge[id].u]+1==lev[edge[id].v] ){ break; } id = edge[ id ].next; } if( id!=-1 ){ q[ tail++ ] = id; id = edge[ id ].v; } else{ if( tail==0 ) break; lev[ edge[q[tail-1]].v ] = -1; id = edge[ q[--tail] ].u; } } } return maxflow; } int main(){ int n,m; while( scanf("%d%d",&n,&m)==2 ){ init(); int a,b,c; int start = 0; int end = n-1; for( int i=0;i<m;i++ ){ scanf("%d%d%d",&a,&b,&c); addedge( a,b,c ); addedge( b,a,0 ); } Dinic( n,start,end ); int ans = 0; for( int i=0;i<cnt;i++ ){ if( edge[i].val==0&&edge[i].flag==true ){ edge[i].val ++ ; if( bfs( n,start,end )==true ){ ans ++ ; } edge[i].val -- ; } } printf("%d\n",ans); } return 0; }
作者:xxx0624 发表于2013-9-8 1:22:22 原文链接
阅读:138 评论:0 查看评论