46分TLE求调
查看原帖
46分TLE求调
639563
封禁用户楼主2023/3/22 20:28
// Problem: P3376 【模板】网络最大流
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3376
// Memory Limit: 128 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

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

#define ll long long
#define INF 1e18

int s, t;
vector<pair<int, ll> > graph[205];
bool vis[205];
int p[205];

ll bfs() {
	memset(vis, 0, sizeof vis);
	queue<pair<int, ll> > que;
	que.emplace(s, INF);
	p[s] = -1;
	vis[s] = 1;
	while (que.size()) {
		int x = que.front().first;
		ll mx = que.front().second;
		que.pop();
		if (x == t) {
			do {
				int pa = p[x];
				for (auto & pr : graph[pa]) {
					int adj = pr.first;
					if (adj != x) {
						continue;
					}
					pr.second -= mx;
				}
				for (auto & pr : graph[x]) {
					int adj = pr.first;
					if (adj != pa) {
						continue;
					}
					pr.second += mx;
				}
			} while ((x = p[x]) != -1);
			return mx;
		}
		for (auto pr : graph[x]) {
			int adj = pr.first;
			ll cost = pr.second;
			if (vis[adj] || cost == 0) {
				continue;
			}
			vis[adj] = 1;
			p[adj] = x;
			que.emplace(adj, min(mx, cost));
		}
	}
	return 0;
}

int main() {
	int n, m;
	scanf("%d %d %d %d", &n, &m, &s, &t);
	s--, t--;
	for (int i = 0; i < m; i++) {
		int u, v;
		ll w;
		scanf("%d %d %lld", &u, &v, &w);
		u--, v--;
		graph[u].emplace_back(v, w);
		graph[v].emplace_back(u, 0);
	}
	ll ans = 0, x;
	while ((x = bfs())) {
		ans += x;
	}
	printf("%lld", ans);
	return 0;
}
2023/3/22 20:28
加载中...