求助EK最大流
  • 板块学术版
  • 楼主2023gdgz01
  • 当前回复9
  • 已保存回复10
  • 发布时间2023/11/8 19:07
  • 上次更新2023/11/8 20:41:23
查看原帖
求助EK最大流
891606
2023gdgz01楼主2023/11/8 19:07

Rt.

在最大流模版题中只有18pts,求助

#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

struct edge
{
	int next, to;
	long long w;
};

bool vis[205];
int n, m, s, t, x, y, cur, head[205], id[205];
long long w, ans, dis[205], g[205][205];
edge e[10005];
queue<int> q;

inline void add(int u, int v, long long w)
{
	++cur;
	e[cur] = {head[u], v, w};
	head[u] = cur;
}

inline bool bfs()
{
	while (!q.empty())
	{
		q.pop();
	}
	q.push(s);
	memset(vis, false, sizeof(vis));
	vis[s] = true;
	dis[s] = 1e9;
	while (!q.empty())
	{
		x = q.front();
		q.pop();
		for (register int i = head[x]; i; i = e[i].next)
		{
			if (e[i].w == 0 || vis[e[i].to])
			{
				continue;
			}
			q.push(e[i].to);
			vis[e[i].to] = true;
			id[e[i].to] = i;
			dis[e[i].to] = min(dis[x], e[i].w);
			if (e[i].to == t)
			{
				return true;
			}
		}
	}
	return false;
}

inline void cal()
{
	x = t;
	w = dis[t];
	while (x != s)
	{
		y = id[x];
		e[y].w -= w;
		e[y ^ 1].w += w;
		x = e[y ^ 1].to;
	}
	ans += w;
}

int main()
{
	scanf("%d%d%d%d", &n, &m, &s, &t);
	while (m--)
	{
		scanf("%d%d%lld", &x, &y, &w);
		g[x][y] += w;
	}
	for (register int i = 1; i <= n; ++i)
	{
		for (register int j = 1; j <= n; ++j)
		{
			if (g[i][j])
			{
				add(i, j, g[i][j]);
				add(j, i, 0);
			}
		}
	}
	while (bfs())
	{
		cal();
	}
	printf("%lld", ans);
	return 0;
}

玄关

2023/11/8 19:07
加载中...