萌新刚学网络流,Dinic求助
查看原帖
萌新刚学网络流,Dinic求助
541069
SuperCowHorse楼主2022/12/29 19:32

RT。

37pts。

#include<bits/stdc++.h>
#define ll long long
#define do double
using namespace std;
const ll inf=0x3f3f3f3f;
const int maxn=205,maxm=5005;
int n,m,s,t;
struct edge{
	int v;ll w;int next;
}e[maxm<<1];int head[maxn],cnt;
inline void add(int u,int v,ll w){
	e[++cnt]=edge{v,w,head[u]};
	head[u]=cnt;
}
inline void ADD(int u,int v,ll w){add(u,v,w);add(v,u,w);}
int dis[maxn],now[maxn];
inline bool bfs(int s,int t){
	memset(dis,0,sizeof(dis));
	queue<int>q;
	dis[s]=1;q.push(s);
	now[s]=head[s];
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].v;
			if(!dis[v]&&e[i].w>0){
				dis[v]=dis[u]+1;
				now[v]=head[v];
				q.push(v);
				if(v==t) return 1;
			}
		}
	}
	return 0;
}
inline ll dfs(int u,int t,ll x){
	if(u==t) return x;
	ll y=x;
	for(int i=now[u];i&&y;i=e[i].next){
		now[u]=i;
		int v=e[i].v;
		if(dis[v]==dis[u]+1&&e[i].w>0){
			ll k=dfs(v,t,min(y,e[i].w));
			if(k==0) dis[v]=0;
			e[i].w-=k;
			e[i^1].w+=k;
			y-=k;
		}
	}
	return x-y;
}
inline ll Dinic(int s,int t){
	ll ans=0;
	while(bfs(s,t))
		ans+=dfs(s,t,inf);
	return ans;
}
signed main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1,u,v;i<=m;++i){
		ll w;
		scanf("%d%d%lld",&u,&v,&w);
		add(u,v,w);add(v,u,0);
	}
	printf("%lld",Dinic(s,t));
	return 0;
}
2022/12/29 19:32
加载中...