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

HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)

2013-08-09 17:19 218 查看
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1532

感觉题意不清楚,不知道是不是个人英语水平问题。本来还以为需要维护入度和出度来找源点和汇点呢,看讨论才知道1就是起点,m就是汇点。。好想把代码写的工程化一点。

#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;
int n, m;
int cap[210][210], flow[210][210], res[210], pre[210];
queue<int>que;

int Edmonds_Karp()
{
while(!que.empty())
{
que.pop();
}
int flow_sum = 0;
while(true)
{
memset(res, 0, sizeof(res));
res[1] = INF;
que.push(1);
while(!que.empty())
{
int u = que.front();
que.pop();
for(int v = 1; v <= m; v++)
{
if(!res[v] && cap[u][v] > flow[u][v])
{
pre[v] = u;
que.push(v);
res[v] = min(res[u], cap[u][v] - flow[u][v]);
}
}
}
if(res[m] == 0)break;
for(int u = m; u != 1; u = pre[u])
{
flow[pre[u]][u] += res[m];
flow[u][pre[u]] -= res[m];
}
flow_sum += res[m];
}
return flow_sum;
}

int main()
{
int u, v, w;
while(scanf("%d %d", &n, &m) != EOF)
{
memset(cap, 0, sizeof(cap));
memset(flow, 0, sizeof(flow));
for(int i = 0; i < n; i++)
{
scanf("%d %d %d", &u, &v, &w);
cap[u][v] += w;
}
printf("%d\n", Edmonds_Karp());
}
return 0;
}


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