Dinic死循环
查看原帖
Dinic死循环
224978
optimize_2楼主2020/5/25 20:10

????

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

int n,m,s,t,cnt,first[100010],next[100010],to[100010],w[10010];
bool vst[100010];

void add(int u,int v,int w2) {
	cnt++;
	w[cnt]=w2;
	to[cnt]=v;
	next[cnt]=first[u];
	first[u]=cnt;
}

int dep[100010];

bool bfs() {
	memset(dep,0,sizeof(dep));
	queue<int>q;
	q.push(1);
	dep[1]=1;
	while(!q.empty()) {
		int e;
		int head=q.front();
		q.pop();
		for(e=first[head];e;e=next[e]) {
			int v=to[e];
			if(dep[v]==0&&w[e]>0) {
				dep[v]=dep[head]+1;
				q.push(v);
			}
		}
	}
	return dep[t]!=0;
}

int dinic(int now,int flow) {
	if(now==t) {
		return flow;
	}
	int out=0;
	for(int e=first[now];e&&flow;e=next[e]) {
		int v=to[now];
		if(dep[e]!=dep[now]+1) continue;
		int outnow=dinic(v,min(w[e],out));
		flow-=outnow;
		w[e]-=outnow;
		w[e^1]+=outnow;
		out+=outnow;
	}
	if(out==0) dep[now]=0;
	return out;
}

int main() {
	int ans=0;
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++) {
		int u2,v2,w2;
		cin>>u2>>v2>>w2;
		add(u2,v2,w2);
		add(v2,u2,0);
	}
	while(bfs()) {
		ans+=dinic(s,1e9+114514);
	}
	cout<<ans;
}
2020/5/25 20:10
加载中...