网络最大流模板求调
查看原帖
网络最大流模板求调
580202
Siegerkranz_2735楼主2024/7/19 14:57
#include<bits/stdc++.h>
using namespace std;
struct Edge{
	int v,next;
	long long w;
}edge[10005];
int n,m,s,t,cnt,head[10005];
long long neck[205],ans;
int flag[205][205],vis[205],path[205];
void addedge(int u,int v,long long w){
	cnt++;
	edge[cnt].v=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}
bool bfs(){
	for(int i=1;i<=n;i++)vis[i]=0;
	queue<int> q;
	q.push(s),vis[s]=1,neck[s]=2147483648;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		for(int i=head[now];i;i=edge[i].next){
			int v=edge[i].v;
			if(edge[i].w<=0)continue;
			if(vis[v])continue;
			neck[v]=min(neck[now],edge[i].w);
			path[v]=i;
			q.push(v);
			vis[v]=1;
			if(v==t)return 1;
		}
	}
	return 0;
}
void update(){
	int loc;
	for(int now=t;now!=s;now=edge[loc^1].v){
		int loc=path[now];
		edge[loc].w-=neck[t];
		edge[loc^1].w+=neck[t];
	}
	ans+=neck[t];
}
int main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1;i<=m;i++){
		int u,v;long long w;
		scanf("%d%d%lld",&u,&v,&w);
		if(!flag[u][v]){
			addedge(u,v,w);
			addedge(v,u,0);
			flag[u][v]=cnt-1;
			flag[v][u]=cnt;
		}
		else{
			edge[flag[u][v]].w+=w;
		}
	}
	for(;bfs();update());
	printf("%lld",ans);
	return 0;
}
2024/7/19 14:57
加载中...