捞求助(听说灌水区大佬多)
  • 板块灌水区
  • 楼主lwx20211103
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/13 21:11
  • 上次更新2023/11/3 04:00:57
查看原帖
捞求助(听说灌水区大佬多)
727008
lwx20211103楼主2023/8/13 21:11

原链接


代码

// Problem: P3376 【模板】网络最大流
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3376
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define p_b push_back
#define ft first
#define nd second
#define pii pair<int, int>
#define pll pair<long long, long long>

using namespace std;

typedef long long ll;

ll n, m, s, t, d[5005], cur[5005];
bool mark[5005];

struct graph
{
	ll to, &cap, &val;//起点,终点,容量,流量
};

vector<graph> edge[505];
// vector<ll> g[505];

void add(ll u, ll v, ll w)
{
	auto p = new ll(w), q = new ll(0);
	edge[u].p_b({v, *p, *q});
	edge[v].p_b({u, *q, *p});
}

bool bfs()
{
	queue<ll> q;
	// memset(d, 0, sizeof(d));
	memset(mark, 0, sizeof(mark));
	q.push(s), d[s] = 0	, mark[s] = 1;
	while (!q.empty())
	{
		ll hd = q.front();
		q.pop();
		for (int i = 0; i < edge[hd].size(); i++)
		{
			graph &e = edge[hd][i];
			if (!mark[e.to] && e.cap > e.val)
			{
				mark[e.to] = true;
				q.push(e.to);
				d[e.to] = d[hd] + 1;
			}
		}
	}
	return mark[t];
}

ll dfs(ll x, ll a)
{
	if (x == t && !a)
		return a;
	ll flow = 0, f;
	for (ll i = cur[x]; i < edge[x].size(); i++)
	{
		cur[x] = i;
		graph &e = edge[x][i];
		if (d[e.to] == d[x] + 1 && 
		(f = dfs(e.to, min(a, e.cap - e.val))) > 0)
		{
			e.val += f;
			edge[x][e.to ^ 1].val -= f;
			flow += f;
			a -= f;
			if (!a) break;
		}
	}
	return flow;
}

ll maxflow()
{
	ll flow = 0;
	while (bfs())
	{
		memset(cur, 0, sizeof(cur));
		flow += dfs(s, 1145141919810);
	}
	return flow;
}

int main()
{
	cin >> n >> m >> s >> t;
	for (int i = 1; i <= m; i++)
	{
		ll u, v, c;
		cin >> u >> v >> c;
		add(u, v, c);
	}
	cout << maxflow();
	return 0;
}

死循环。我没有找到bug所在,求助

2023/8/13 21:11
加载中...