萌新,Dinic只输出0,求助
查看原帖
萌新,Dinic只输出0,求助
249074
mc123456「空白」楼主2023/4/13 19:26

Dinic板子,只输出0

#include <bits/stdc++.h>
using namespace std;

const int N = 210, M = 10010;
class MF
{
	int s, t, cnt = 1;
	long long max_flow = 0;
	int dep[N], head[N], rad[N];
	struct Edge
	{
		int y, nxt;
		long long cap, flow;
		Edge() {}
		Edge(int _y, long long _cap, int _nxt) { y = _y, cap = _cap, nxt = _nxt; }
	} e[M];

	bool bfs()
	{
		queue<int> q;
		memset(dep, 0, sizeof(dep));
		dep[s] = 1;
		q.push(s);
		while (!q.empty())
		{
			int x = q.front();
			q.pop();
			for (int i = head[x]; i; i = e[i].nxt)
			{
				int y = e[i].y;
				if (dep[y] || e[i].cap <= e[i].flow)
					continue;
				dep[y] = dep[x] + 1;
				q.push(y);
			}
		}
		return dep[t];
	}
	long long dfs(int x, long long flow)
	{
		if (x == t || !flow)
			return flow;
		long long ret = 0;
		for (int &i = rad[x]; i; i = e[i].nxt)
		{
			int y = e[i].y;
			long long d;
			if (dep[y] == dep[x] + 1 && (d = dfs(y, min(flow - ret, e[i].cap - e[i].flow))))
			{
				ret += d;
				e[i].flow += d, e[i ^ 1].flow -= d;
				if (ret == flow)
					return ret;
			}
		}
		return ret;
	}

public:
	MF() {}
	MF(int _s, int _t) { s = _s, t = _t; }
	long long get_MF() { return max_flow; }
	void init()
	{
		memset(head, 0, sizeof(head));
		cnt = 1;
	}
	void add(int u, int v, int w)
	{
		e[++cnt] = Edge(v, w, head[u]);
		head[u] = cnt;
		e[++cnt] = Edge(u, 0, head[v]);
		head[v] = cnt;
	}
	long long dinic()
	{
		while (bfs())
		{
			memcpy(rad, head, sizeof(head));
			max_flow += dfs(s, 9e18);
		}
		return max_flow;
	}
};

int n, m, s, t;

int main()
{
	cin >> n >> m >> s >> t;
	MF d(s, t);
	for (int i = 1; i <= m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		d.add(u, v, w);
	}
	cout << d.dinic() << endl;
	return 0;
}
2023/4/13 19:26
加载中...