EK WA36pts
查看原帖
EK WA36pts
1048875
GLY0912楼主2024/12/10 21:02
#include <iostream>
#include <queue>
#define int long long
using namespace std;
const int N=5010,MAX=0x3f3f3f;
struct node{
	int val,to,nxt;
}e[N*2];
int tot=1,head[N],vis[N],n,m,s,t,dis[N],pre[N],ans=0,flag[N][N];
void add(int u,int v,int w){
	e[++tot].to=v;
	e[tot].val=w;
	e[tot].nxt=head[u];
	head[u]=tot;
	return ;
}
int bfs(){
	for(int i=1;i<=n;i++) vis[i]=0;
	queue<int> q;
	q.push(s);
	vis[s]=1;
	dis[s]=MAX;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		for(int i=head[now];i;i=e[i].nxt){
			if(e[i].val==0) continue;
			int v=e[i].to;
			if(vis[v]==1) continue;
			dis[v]=min(dis[now],e[i].val);
			pre[v]=i;
			q.push(v);
			vis[v]=1;
			if(v==t) return 1;
		}
	}
	return 0;
}
void update(){
	int x=t;
	while(x!=s){
		int v=pre[x];
		e[v].val-=dis[t];
		e[v^1].val+=dis[t];
		x=e[v^1].to;
	}
	ans+=dis[t];
	return ;
}
signed main(){
	cin>>n>>m>>s>>t;
	int u,v,w;
	for(int i=1;i<=m;i++){
		cin>>u>>v>>w;
		if(flag[u][v]==0){
			add(u,v,w);add(v,u,w);
			flag[u][v]=tot;
		}else{
			e[flag[u][v]-1].val+=w;
		}
	}
	while(bfs()) update();
	cout<<ans;
	return 0;
}
2024/12/10 21:02
加载中...