ek算法为什么注释掉”判断汇点是否已收到流,如果收到就跳数循环“就过了。
查看原帖
ek算法为什么注释掉”判断汇点是否已收到流,如果收到就跳数循环“就过了。
566220
dinzihan楼主2022/10/22 11:25

rt,不注释掉的话除了第一个点,其他全t

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vector<ll>> vllvll;
struct zym {
	ll from, to, cup, flow;//边的起点,终点,容量,流量
};
int sum[100] = { 0,1 };
void solve() {
	ll n, m, e, maxflow = 0, kl, now;
	cin >> n >> m >> e;
	ll S = 0, T = n + m + 1;
	vector<zym>edge;
	vllvll g(n + m + 10);
	vll f(n + m + 10), per(n + m + 10);
	map<pair<ll, ll>, int>op;
	for (int i = 1; i <= e; i++) {
		ll a, b;
		cin >> a >> b;
		b += n;
		edge.push_back({ a,b,1,0 });
		edge.push_back({ b,a,0,0 });
		kl = edge.size();
		g[a].push_back(kl - 2);
		g[b].push_back(kl - 1);
	}
	for (int i = 1; i <= n; i++) {
		edge.push_back({ S,i,1,0 });
		edge.push_back({ i,S,0,0 });
		kl = edge.size();
		g[S].push_back(kl - 2);
		g[i].push_back(kl - 1);
	}
	for (int i = n + 1; i <= n + m; i++) {
		edge.push_back({ i,T,1,0 });
		edge.push_back({ T,i,0,0 });
		kl = edge.size();
		g[i].push_back(kl - 2);
		g[T].push_back(kl - 1);
	}
	queue<ll>Q;
	while (1) {
		for (int i = 0; i <= T; i++)f[i] = 0;
		f[0] = INT_MAX;
		Q.push(0);
		while (!Q.empty()) {
			now = Q.front();
			Q.pop();
			for (auto to : g[now]) {
				if (!f[edge[to].to] && edge[to].cup > edge[to].flow) {
					per[edge[to].to] = to;
					f[edge[to].to] = min(f[now], edge[to].cup - edge[to].flow);
					Q.push(edge[to].to);
				}
			}
			if (f[T])break;
		}
		if (!f[T])break;
		for (now = T; now != S; now = edge[per[now]].from) {
			edge[per[now]].flow += f[T];
			edge[per[now] ^ 1].flow -= f[T];
		}
	}
	for (int i = 1; i <= n; i++) {
		for (auto to : g[i]) {
			if (edge[to].flow > 0)maxflow++;
		}
	}
	cout << maxflow << endl;
}
int main() {
	int _T = 1;
	//cin >> _T;
	while (_T--)
		solve();
	return 0;

}
2022/10/22 11:25
加载中...