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

hdu 1532 Drainage Ditches

2012-09-04 23:04 169 查看
    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532

做的第一道网络流,以前只能看着群里大神在那说

,一直没去看算导,今晚花了两个小时看了Ford-Fulkerson方法,在风神的博客上找了第一题,参考了别人,实现了一下,还是太弱啊!

,下面是代码,没去加注释,有一个要注意的就是,两个交叉点可能有多条不同大小的沟渠连接:

//author:zhengjj.asd@gmail.com

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

#define Max 10000000
#define M 201

int n, m, maxflow;
int map[M][M], pre[M];
bool mark[M];

void init()
{
memset(map, 0, sizeof(map));
int s, e, c;
for(int i = 0; i < n; ++ i)
{
scanf("%d %d %d", &s, &e, &c);
map[s][e] += c;
}

maxflow = 0;
}

void FordFulkerson()
{
while(1)
{
queue <int> q;
memset(mark, false, sizeof(mark));
memset(pre, 0, sizeof(pre));
q.push(1);
mark[1] = true;
while(!q.empty())
{
int cur = q.front();
q.pop();
if(cur == m) break;
for(int i = 1; i <= m; ++ i)
{
if(mark[i] == false && map[cur][i] > 0)
{
q.push(i);
mark[i] = true;
pre[i] = cur;
}
}
}
if(mark[m] == false) break;
int min = Max;
int i = m;
while(i != 1)
{
if(min > map[pre[i]][i])
min = map[pre[i]][i];
i = pre[i];
}

i = m;
while(i != 1)
{
map[pre[i]][i] -= min;
map[i][pre[i]] += min;
i = pre[i];
}
maxflow += min;
}
}

int main()
{
while(~scanf("%d %d", &n, &m))
{
init();
FordFulkerson();
printf("%d\n", maxflow);
}
return 0;
}


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