您的位置:首页 > 大数据 > 人工智能

pku1273 Drainage Ditches

2011-07-29 20:16 176 查看
题目链接:pku1273 hdu1532

方法:最大流 EK算法

思想:本地为典型的最大流题目,只需要注意的是有些时候从一处到另一处不只有一条排水沟。

因此是c[a-1][b-1]+=d; 而不是直接赋值。

代码:

//pku1273 hdu1532
#include<string.h>
#define VMAX 201
#define INF 0x7ffffff
int n, m; //分别表示图的边数和顶点数
int c[VMAX][VMAX];   //容量
int Edmonds_Karp( int s, int t ) //输入源点和汇点
{
int p,q,queue[VMAX],u,v,pre[VMAX],flow= 0,aug;
while(true)
{    memset(pre,-1,sizeof(pre)); //记录父节点
for( queue[p=q=0]=s; p<=q; p++ ) //广度优先搜索
{   u= queue[p];
for( v=0; v<m&&pre[t]<0; v++ )
if( c[u][v]>0 && pre[v]<0 )   pre[v]=u, queue[++q]=v;
if( pre[t]>=0 )    break;
}
if( pre[t]<0 )    break; //不存在增广路
aug= INF;    //记录最小残留容量
for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
if(c[u][v]<aug)    aug=c[u][v];
for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
c[u][v]-=aug, c[v][u]+=aug;
flow+= aug;
}
return flow;
}
#include<stdio.h>
int main()
{
while(scanf("%d%d",&n,&m)!=-1)
{
int a,b,d;
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
{	scanf("%d%d%d",&a,&b,&d);
c[a-1][b-1]+=d;
}
printf("%d\n",Edmonds_Karp(0,m-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: