dinic算法实现
今天代码实现时,发现我昨天的理解有一个误区:
分层图是要不断建立的,而不是建一次就够了。
下面贴出我的代码(不得不说,用链式前向星存图真是方便)
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- int m,n,ne=0;
- struct node
- {
- int to,next,w;
- }edge[233];
- int head[233];
- int dis[233];
- void add(int u,int v,int c)
- {
- ne++;
- edge[ne].to=v;
- edge[ne].next=head[u];
- edge[ne].w=c;
- head[u]=ne;
- return;
- }//用链式前向星存图
- int q[233];
- bool bfs()
- {
- int i,j,h,r;
- memset(dis,0xff,sizeof(dis));
- dis[1]=0;h=0;r=1;
- q[0]=1;
- while(h<r)
- {
- int now=q[h];h++;
- i=head[now];
- while(i)
- {
- if(edge[i].w&&dis[edge[i].to]<0)
- {
- q[r++]=edge[i].to;
- dis[edge[i].to]=dis[now]+1;
- }
- i=edge[i].next;
- }
- }
- if(dis[n]>0)
- return 1;
- else
- return 0;
- }
- int find(int x,int low)
- {
- if(x==n) return low;
- int i=head[x];
- int w,used=0;
- while(i)
- {
- if(edge[i].w&&dis[edge[i].to]==dis[x]+1)
- {
- w=low-used;
- w=find(edge[i].to,min(w,edge[i].w));
- edge[i].w-=w;
- edge[i+1].w+=w;
- used+=w;
- if(used==low) return low;
- }
- i=edge[i].next;
- }
- if(!used) dis[x]=-1;
- return used;
- }
- int main()
- {
- int u,v,c;
- scanf("%d%d",&n,&m);
- for(int i=1;i<=m;i++)
- {
- scanf("%d%d%d",&u,&v,&c);
- add(u,v,c);
- add(v,u,c);
- }
- int ans=0,tans;
- while(bfs())
- {
- while(tans=find(1,0x7fffffff)) ans+=tans;
- }
- printf("%d\n",ans);
- return 0;
- }
————————完结撒花——————————————————————————2016/8/22————————