您的位置:首页 > 其它

poj 1273

2013-09-12 14:28 274 查看
网络流之最大流的基础题;

可以使用dinic算法和EK算法:

分别对着模板敲了一遍:

dinic:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 205
#include<queue>
using namespace std;

int map[maxn][maxn],p[maxn],n,m;
bool flag[maxn];
bool bfs()
{
queue<int>q;
memset(flag,0,sizeof flag);
memset(p,-1,sizeof p);
q.push(1);
flag[1]=1;
while(!q.empty())
{
int now=q.front();
q.pop();
if(now==m) return 1;
for(int i=1; i<=m; i++)
if(map[now][i]>0&&!flag[i])
{
flag[i]=1;
p[i]=now;
q.push(i);
}
}
return 0;
}

void ek()
{
int u,flow=0,t;
while(bfs())
{
t=99999999;
u=m;
while(p[u]!=-1)
{
t=min(t,map[p[u]][u]);
u=p[u];
}
flow+=t;
u=m;
while(p[u]!=-1)
{
map[p[u]][u]-=t;
map[u][p[u]]+=t;
u=p[u];
}
}
printf("%d\n",flow);
}

int main()
{
int a,b,f;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(map,0,sizeof map);
while(n--)
{
scanf("%d%d%d",&a,&b,&f);
map[a][b]+=f;
}
ek();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: