HDU 3549 Flow Problem(Edmond Karp算法)



【思路】

最大流模板题,运用Edmond Karp算法求解。


【代码】

//******************************************************************************
// File Name: HDU_3549.cpp
// Author: Shili_Xu
// E-Mail: [email protected]
// Created Time: 2018年05月17日 星期四 22时52分17秒
//******************************************************************************

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;

const int MAXN = 205, INF = 0x3f3f3f3f;

struct edge {
	int from, to, cap, flow;
	
	edge() {}
	edge(int u, int v, int c, int f) : from(u), to(v), cap(c), flow(f) {}
};

int t, n, m;
vector<edge> e;
vector<int> g[MAXN];
int p[MAXN], a[MAXN];
queue<int> q;

void init()
{
	e.clear();
	for (int i = 1; i<= n; i++) g[i].clear();
}

void add_edge(int from, int to, int cap, int flow)
{
	e.push_back(edge(from, to, cap, flow));
	g[from].push_back(e.size() - 1);
}

int edmond_karp(int s, int t)
{
	int ans = 0;
	while (true) {
		memset(a, 0, sizeof(a));
		a[s] = INF;
		while (!q.empty()) q.pop();
		q.push(s);
		while (!q.empty()) {
			int u = q.front(); q.pop();
			for (int i = 0; i < g[u].size(); i++) {
				edge &now = e[g[u][i]];
				if (!a[now.to] && now.cap - now.flow > 0) {
					p[now.to] = g[u][i];
					a[now.to] = min(a[u], now.cap - now.flow);
					q.push(now.to);
				}
			}
			if (a[t]) break;
		}
		if (!a[t]) break;
		for (int i = t; i != s; i = e[p[i]].from) {
			e[p[i]].flow += a[t];
			e[p[i] ^ 1].flow -= a[t];
		}
		ans += a[t];
	}
	return ans;
}

int main()
{
	scanf("%d", &t);
	for (int kase = 1; kase <= t; kase++) {
		scanf("%d %d", &n, &m);
		init();
		while (m--) {
			int u, v, c;
			scanf("%d %d %d", &u, &v, &c);
			add_edge(u, v, c, 0);
			add_edge(v, u, 0, 0);
		}
		int ans = edmond_karp(1, n);
		printf("Case %d: %d\n", kase, ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/shili_xu/article/details/80358509
今日推荐