/*
AC,一道基本最大流问题,采用Edmonds_Karp算法,算法复杂度O(V*E*E)
*/
#include <iostream>
#include <queue>
using namespace std;
const int nMax = 207;
const int INF = 0x7fffffff;
queue<int> Q;
int start, endd, path[nMax], flow[nMax], map[nMax][nMax];
int bfs()//广度优先查找增广路,算法复杂度O(E)
{
memset(path, -1, sizeof(path));
while(!Q.empty()) Q.pop();
Q.push(start);
flow[start] = INF;
path[start] = 0;
while(!Q.empty())
{
int u = Q.front();
Q.pop();
if(u == endd) break;
for(int v = 1; v <= endd; ++ v)
{
if(path[v] == -1 && map[u][v] > 0)
{
flow[v] = flow[u] < map[u][v] ? flow[u] : map[u][v];
path[v] = u;
Q.push(v);
}
}
}
if(path[endd] == -1)
return -1;
else
return flow[endd];
}
int Edmonds_Karp()//算法复杂度O(V*E)
{
int max_flow = 0;
int step;
while((step = bfs()) != -1)
{
max_flow += step;
int now = endd;
while(now != start)
{
int pre = path[now];
map[pre][now] -= step;
map[now][pre] += step;
now = pre;
}
}
return max_flow;
}
int main()
{
//freopen("f://data.in", "r", stdin);
int N, M;
while(scanf("%d %d", &N, &M) != EOF)
{
memset(map, 0, sizeof(map));
for(int i = 0; i < N; ++ i)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
map[u][v] += w;//可能不仅仅一组数据
}
start = 1;
endd = M;
printf("%d\n", Edmonds_Karp());
}
return 0;
}
HDOJ 1532 Drainage Ditches(最大流)
最新推荐文章于 2019-03-02 18:29:34 发布