• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

poj 1273 Drainage Ditches 最大流

        第一次写最大流,照着书上面敲。

        用Edmonds_karp算法,每次通过bfs搜出一条增广路径加到流中,直到不能搜到为止。这题要注意有重边,多条重边要加在一起,用+=

 

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

const int N = 205;
const int INF = 1000000000;

int c[N][N];
int flow[N][N];
int min_flow[N];
int pre[N];

int n, m;

int max_flow()
{
	memset(flow, 0, sizeof(flow));

	int u;
	int ans = 0;

	while (1)
	{
		memset(pre, -1, sizeof(pre));	
		memset(min_flow, 0, sizeof(min_flow));
		queue<int> Q;
		Q.push(1);

		min_flow[1] = INF;
		while (!Q.empty())
		{
			u = Q.front();
			Q.pop();

			if (u == m) 
				break;

			for (int i = 2; i <= m; i++)
				if (pre[i] < 0 && c[u][i] - flow[u][i] > 0)
				{
					pre[i] = u;
					min_flow[i] = min(min_flow[u], c[u][i] - flow[u][i]);
					Q.push(i);
				}
		}

		if (pre[m] == -1) break;

		for (int v = m; v != 1; v = pre[v])
		{
			u = pre[v];
			flow[u][v] += min_flow[m];
			flow[v][u] -= min_flow[m];
		}

		ans += min_flow[m];
	}

	return ans;
}

int main()
{
	int x, y, z;

	while (scanf("%d%d", &n, &m) != EOF)
	{
		memset(c, 0, sizeof(c));
		for (int i = 0; i < n; i++)
		{
			scanf("%d%d%d", &x, &y, &z);
			c[x][y] += z;
		}

		printf("%d\n", max_flow());
	}
	return 0;
}

posted on 2011-01-28 15:31  sysuwhj  阅读(318)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3