20pts求调(玄1~3关)
查看原帖
20pts求调(玄1~3关)
1287433
ycyxh1楼主2025/7/2 16:22
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
struct Node{
	int to,w,v;
};
vector<Node>a[205];
int n,m,s,t,ans,dis[205],now[205],qwq[205];
bool vis;
queue<int>q;
inline void bfs(int p){
//	cout<<p<<' '<<dis[p]<<'\n';
	if(p==t){
		vis=1;
		return;
	}
	for(int i=0;i<qwq[p];i++){
//		cout<<"qwq"<<'\n';
		if(dis[a[p][i].to]==inf&&a[p][i].w>0){
//			cout<<a[p][i].w<<' '<<p<<' '<<a[p][i].to<<'\n';
			dis[a[p][i].to]=dis[p]+1;
			q.push(a[p][i].to);
		}
	}
}
inline bool Bfs(){
	vis=0;
	q.push(s);
	for(int i=1;i<=n;i++){
		now[i]=0;
		dis[i]=inf;
	}
	dis[s]=0;
	while(q.size()){
		bfs(q.front());
		q.pop();
	}
	return vis;
}
int dfs(int p,int val){
//	cout<<p<<' '<<val<<'\n';
	if(p==t){
		return val;
	}
	int sum=val;
	for(int i=now[p];sum&&i<qwq[p];i++){
		if(dis[a[p][i].to]!=dis[p]+1){
			continue;
		}
		now[p]=i;
		int k=dfs(a[p][i].to,min(sum,a[p][i].w));
		if(k==0){
			dis[a[p][i].to]=inf;
			continue;
		}
		sum-=k;
		a[p][i].w-=k;
		a[a[p][i].to][a[p][i].v].w+=k;
	}
	return val-sum;
}
inline int Dfs(){
	return dfs(s,inf);
}
inline void Dinic(){
	while(Bfs()){
//		cout<<ans<<endl;
		int w=Dfs();
		if(!w){
			return;
		}
		ans+=w;
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		a[u].push_back({v,w,qwq[v]});
		a[v].push_back({u,0,qwq[u]});
		qwq[u]++;
		qwq[v]++;
	}
	Dinic();
	cout<<ans; 
	return 0;
}
/*
4 7 1 4
1 2 5
2 3 5
3 2 5
1 3 5
1 4 10
2 4 10
3 4 10
*/

玄关qwq

2025/7/2 16:22
加载中...