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————————
分层图是要不断建立的,而不是建一次就够了。
下面贴出我的代码(不得不说,用链式前向星存图真是方便)
#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————————
相关文章推荐
- hdu1532 当前弧优化的dinic算法实现
- poj 1459 Power Network : 最大网络流 dinic算法实现
- poj 1459 Power Network : 最大网络流 dinic算法实现
- Dinic算法的程序实现
- poj 1273 最大流(Ford-Fulkerson算法和Dinic算法分别实现)
- Dinic算法详解及实现
- hdu3572,网络流,dinic算法实现
- zoj 3229 dinic算法的非递归实现以及有上下界的有源汇的网络流的最大流的求解
- Dinic算法实现二分图匹配
- 用CTI实现与Web交谈
- ping程序的C#实现
- 利用Hook技术实现键盘监控
- 用Delphi实现远程屏幕抓取
- 如何利用C++ Builder 4.0 Enterprise实现对Excel97 的调用
- 应用程序敏感键的实现
- 在PB中快速实现数据库树形结构
- 在PowerBuilder中实现菜单条级权限的设置
- PB7.0中实现Jaguar GTS组件开发
- 如何实现数据的自动录入
- [导入]通用Delphi数据库输入控件DBPanel的实现