蒟蒻求助最大流
查看原帖
蒟蒻求助最大流
400468
Aakkosetsumussa楼主2023/8/12 09:21
#include <bits/stdc++.h>
using namespace std;
const long long inf=1e9, maxn=500005;
long long n, m, s, t, u, v;
long long w, ans, dis[maxn];
long long tot=1, now[maxn], head[maxn];
struct node {
	long long to, net, val;
} e[maxn];
inline void add(long long u, long long v, long long w) {
	e[++tot].to=v, e[tot].val=w, e[tot].net=head[u], head[u]=tot;
	e[++tot].to=u, e[tot].val=0, e[tot].net=head[v], head[v]=tot;
}
inline long long bfs() {
	for(long long i=1; i<=n; i++) dis[i]=inf;
	queue<long long> q;
	q.push(s);
	dis[s]=0, now[s]=head[s];
	while(!q.empty()) {
		long long u=q.front();
		q.pop();
		for(long long i=head[u]; i; i=e[i].net) {
			long long v=e[i].to;
			if(e[i].val>0&&dis[v]==inf) {
				q.push(v);
				now[v]=head[v],	dis[v]=dis[u]+1;
				if(v==t) return 1;
			}
		}
	}
	return 0;
}
inline long long dfs(long long x, long long sum) {
	if(x==t) return sum;
	long long k, res=0;
	for(long long i=now[x]; i&&sum; i=e[i].net) {
		now[x]=i;
		long long v=e[i].to;
		if(e[i].val>0&&(dis[v]==dis[x]+1)) {
			k=dfs(v, min(sum, e[i].val));
			if(k==0) dis[v]=inf;
			e[i].val-=k, e[i^1].val+=k;
			res+=k, sum-=k;
		}
	}
	return res;
}
signed main() {
	cin>>n>>m;
	s=1, t=m;
	for(long long i=1; i<=n; i++) {
		scanf("%lld %lld %lld", &u, &v, &w);
		add(u, v, w);
	}
	while(bfs()) ans+=dfs(s, inf);
	return cout<<ans, 0;
}
2023/8/12 09:21
加载中...