dinic 一直 t 两个点 找不到 错误
查看原帖
dinic 一直 t 两个点 找不到 错误
429219
aruichen楼主2022/10/4 23:17
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1e6 + 10;
int ne[N], e[N], w[N], h[N], idx;
int d[N], cur[N];
int s = 1, t = 26;
void add(int a, int b, int c)
{
	e[idx] = b;
	w[idx] = c;
	ne[idx] = h[a];
	h[a] = idx++;
}
bool bfs()
{
	memset(d, 0, sizeof(d));
	d[s] = 1;
	queue<int> op;
	op.push(s);
	while (op.size())
	{
		auto x = op.front();
		op.pop();
		for (int i = h[x]; i != -1; i = ne[i])
		{
			int j = e[i];
			if (w[i] > 0 && !d[j])
			{
				d[j] = d[x] + 1;
				if (j == t) return 1;
				op.push(j);
			}
		}
	}
	return 0;
}
int dfs(int u, int sum)
{
	if (u == t || !sum) return sum;
	int flow = 0;
	for (int& i = cur[u]; i != -1; i=ne[i])
	{
		int f, j = e[i];
		if (d[j] == d[u] + 1 && (f = dfs(j, min(w[i], sum))))
		{
			sum -= f;
			flow += f;
			w[i] -= f;
			w[i ^ 1] += f;
			if (!sum) break;
		}
	}
	return flow;
}
signed main()
{
	memset(h, -1, sizeof(h));
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		string a, b;
		cin >> a >> b;
		int x;
		cin >> x;
		add(int(a[0] - 'A' + 1), int(b[0] - 'A' + 1), x);
		add(int(b[0] - 'A' + 1), int(a[0] - 'A' + 1), 0);
	}
	int ans = 0;
	while (bfs())
	{
		for (int i = 0; i < idx; i++) cur[i] = h[i];
		ans += dfs(s, 0x3f3f3f3f);
	}
	cout << ans;
}
2022/10/4 23:17
加载中...