社区讨论

关于数据范围

P3376【模板】网络最大流参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lobv67kv
此快照首次捕获于
2023/10/30 03:28
2 年前
此快照最后确认于
2023/11/04 08:19
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define reg register 
#define il inline
const int inf = 1 << 28;
const int N = 205, M = 10005;
int head[N], ver[M], wei[M], nxt[M], d[N], now[M];
int n, m, s, t, cnt = 1;
ll maxflow;
queue<int> q;
void add(int x, int y, int z) {
	ver[++cnt] = y, wei[cnt] = z, nxt[cnt] = head[x], head[x] = cnt;
}

bool bfs() {
	memset(d, 0, sizeof(d));
	while (q.size()) q.pop();
	q.push(s); d[s] = 1; now[s] = head[s];
	while (!q.empty()) {
		int x = q.front(); q.pop();
		for (int i = head[x]; i; i = nxt[i])
			if (wei[i] && !d[ver[i]]) {
				q.push(ver[i]);
				now[ver[i]] = head[ver[i]];
				d[ver[i]] = d[x] + 1;
				if (ver[i] == t) return 1;
			}
	}
	return 0;
}

int dinic(int x, int flow) {
	if (x == t) return flow;
	int rest = flow, k, i;
	for (i = now[x]; i && rest; i = nxt[i])
		if (wei[i] && d[ver[i]] == d[x] + 1) {
			k = dinic(ver[i], min(rest, wei[i]));
			if (!k) d[ver[i]] = 0;
			wei[i] -= k;
			wei[i ^ 1] + k;
			rest -= k;
		}
	now[x] = i;
	return flow - rest;
}

int main()
{
	scanf("%d%d", &n, &m);
	scanf("%d%d", &s, &t);
	for (int i = 1; i <= m; ++i) {
		int x, y, c; scanf("%d%d%d", &x, &y, &c);
		add(x, y, c), add(y, x, 0);
	}
	int flow = 0;
	while (bfs())
		while (flow = dinic(s, inf)) maxflow += flow;
	printf("%lld", maxflow);
	return 0;
}
这里我的 infinf 取到 2282^{28} 都可以过
然而 ww 的极限能到 2312^{31}-11,所以是数据较弱吗?

回复

7 条回复,欢迎继续交流。

正在加载回复...