HDU_1532 Drainage Ditches
很明显的最大流题目,通过不断寻找增广路,每找到一条就做相应的修改,直到找不到为止
#include <iostream>
#include <queue>
#define max 100000000
#define num 205
using namespace std;
int n, m, f;
//map[][]记录权值,mark[]标记是否访问过,pre[]记录增广路
int map[num][num], mark[num], pre[num];
void init()
{
int a, b, c;
memset(map, 0, sizeof(map));
f = 0;
for (int i = 0; i < m; ++ i)
{
cin >> a >> b >> c;
map[a][b] = c;
}
}
void max_flow()
{
//不断寻找增广路,知道找不到为止,找不到的标志为 mark[n]==0
while (1)
{
queue<int> q;
memset(mark, 0, sizeof(mark));
memset(pre, 0, sizeof(pre));
mark[1] = 1;
q.push(1);
while (!q.empty())
{
int cur = q.front();
q.pop();
//找到了增广路,跳出
if (cur == n) break;
for (int i = 1; i <= n; ++ i)
{
if (mark[i] == 0 && map[cur][i] > 0)
{
mark[i] = 1;
q.push(i);
pre[i] = cur;
}
}
}
//如果没找到可增广的路,直接跳出
if (mark[n] == 0) break;
int min = max;
//计算该增广路最大可增加的流量
for (int i = n; i != 1; i = pre[i])
{
if (min > map[pre[i]][i])
{
min = map[pre[i]][i];
}
}
//原路返回,修改路劲上边的权值
for (int i = n; i != 1; i = pre[i])
{
map[pre[i]][i] -= min;
map[i][pre[i]] += min;
}
//总流量增加
f += min;
}
}
int main()
{
while (cin >> m >> n)
{
init();
max_flow();
cout << f << endl;
}
return 0;
}
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架