蒟蒻dinic求调
查看原帖
蒟蒻dinic求调
1140118
wanghaolin44243787楼主2024/8/31 09:54
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 1003
#define INF 0x7fffffff
ll head[MAXN<<1],to[MAXN<<1],nxt[MAXN<<1],v[MAXN<<1],cnt=1,now[MAXN],dis[MAXN],n,s,t,k,res,m,x,y,z,ans;
inline void add(ll x,ll y,ll z){
	to[++cnt]=y;
	v[cnt]=z;
	nxt[cnt]=head[x];
	head[x]=cnt;
	to[++cnt]=x;
	v[cnt]=0;
	nxt[cnt]=head[y];
	head[y]=cnt;
}
ll bfs(){
	for(int i=1;i<=n;i++)dis[i]=INF;
	queue<ll>q;
	q.push(s);
	dis[s]=0;
	now[s]=head[s];
	while(!q.empty()){
		ll x=q.front();
		q.pop();
		for(int i=head[x];i;i=nxt[x]){
			if(v[i]>0&&dis[to[i]]==INF){
				q.push(to[i]);
				now[to[i]]=head[to[i]];
				dis[to[i]]=dis[x]+1;
				if(to[i]==t)return 1;
			}
		}
	}
	return 0;
}
ll dfs(ll x,ll sum){
	if(x==t)return sum;
	res=0;
	for(int i=now[x];i&&sum;i=nxt[i]){
		now[x]=i;
		if(v[i]>0&&(dis[to[i]]==dis[x]+1)){
			k=dfs(to[i],min(sum,v[i]));
			if(k==0)dis[to[i]]=INF;
			v[i]-=k;
			v[i^1]+=k;
			sum-=k;
			res+=k;
		}
	}
	return res;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++){
		cin>>x>>y>>z;
		add(x,y,z);
	}
	while(bfs()){
		ans+=dfs(s,INF);
	}
	cout<<ans;
	return 0;
}
2024/8/31 09:54
加载中...