64分又WA又T求助
查看原帖
64分又WA又T求助
342868
qfpjm楼主2022/2/11 19:35
#include <bits/stdc++.h>

using namespace std;

struct node
{
	int e, v, nxt;
}edge[20005];

int n, m, s, t;
int cnt = 1, head[20005], dis[20005];

void add(int u, int v, int w)
{
	cnt ++;
	edge[cnt].e = v;
	edge[cnt].v = w;
	edge[cnt].nxt = head[u];
	head[u] = cnt;
}

bool bfs(int s, int t)
{
	memset(dis, 0, sizeof(dis));
	dis[s] = 1;
	queue<int> que;
	que.push(s);
	while (!que.empty())
	{
		int r = que.front();
		que.pop();
		for (int i = head[r] ; i != -1 ; i = edge[i].nxt)
		{
			int j = edge[i].e;
			if (!dis[j] && edge[i].v)
			{
				dis[j] = dis[r] + 1;
				que.push(j);
				if (j == t)
				{
					return true;
				}
			}
		}
	}
	if(dis[t])
	{
		return true;
	}
    else
	{
		return false;
	}
}

int dfs(int u, int ed, int flo)
{
	if (u == ed)
	{
		return flo;
	}
	int ans = 0;
	for (int i = head[u] ; i != -1 && ans < flo ; i = edge[i].nxt)
	{
		int v = edge[i].e;
		if (dis[v] == dis[u] + 1 && edge[i].v > 0)
		{
			int d = dfs(v, ed, min(flo - ans, edge[i].v));
			edge[i].v -= d;
			edge[i ^ 1].v += d;
			ans += d;
		}
	}
	return ans;
}

int dinic(int s, int t)
{
	int ans = 0;
	while (bfs(s, t))
	{
		ans += dfs(s, t, INT_MAX);
	}
	return ans;
}

int main()
{
	memset(head, -1, sizeof(head));
	cin >> n >> m >> s >> t;
	for (int i = 1 ; i <= m ; i ++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, 0);
	}
	cout << dinic(s, t);
}
2022/2/11 19:35
加载中...