POJ3204+DInic+maxflow

来源:互联网 发布:linux 打开22端口 编辑:程序博客网 时间:2024/05/17 06:51
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;}


原创粉丝点击