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;}
- POJ3204+DInic+maxflow
- poj3204 Ikki's Story I - Road Reconstruction 网络流dinic
- maxflow
- MaxFLOW
- Maxflow-Mincut
- dinic
- dinic
- Dinic
- Dinic
- dinic
- Dinic
- dinic
- Dinic
- dinic
- dinic
- Dinic
- dinic
- Dinic
- php-cgi占用cpu100%的一次排障之旅&poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
- 测试几种比较float的效率
- VC 调用api(Google Com Api)
- myeclipse10.0优化及SVN安装配置
- C++基础之-------_stdcall,_cdecl区别
- POJ3204+DInic+maxflow
- 一条select语句将一个用逗分隔的列分成多行
- C++对象序列化简介与选型
- Cocos2d-x 2.0.1 运行在MFC中的一种方法
- quartz 相关配置文件
- 最短路算法(Dijsktra + 优先队列)
- CoCos2d-x CCArray multiple-String 插入多个字符串值 crash解决方法
- keil c 中用宏构建自己的printf函数
- ajax JSONP请求 处理回调函数的注意:jsonpCallback是区分大小写