您的位置:首页 > 理论基础 > 计算机网络

dinic算法实现

2016-08-22 15:07 357 查看
今天代码实现时,发现我昨天的理解有一个误区:

分层图是要不断建立的,而不是建一次就够了。

下面贴出我的代码(不得不说,用链式前向星存图真是方便)

#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
>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————————
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络流 算法 图论