HDOJ 1532 Drainage Ditches(最大流)

/*
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;
}

你可能感兴趣的:(算法,Path)