Dinic 55分求助
查看原帖
Dinic 55分求助
227728
冰糖鸽子「僕は…」楼主2021/1/7 17:52

RT,WA 4,7,8,9,10


// Problem: P3376 【模板】网络最大流
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3376
// Memory Limit: 128 MB
// Time Limit: 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define M 205
bool vis[M];
int ans,h[M],hav[M],u,v,W,n,m,s,t,w[M][M];
vector<int>road[M];//first为v,second为w
queue<int>q;
bool R()//Bfs求联通否/每点深度
{
	int up,vp;
	q=queue<int>();
	memset(h,0,sizeof(h));
	q.push(s);h[s]=1;
	while(!q.empty())
	{
		up=q.front();q.pop();
		vis[up]=1;
		for(int i=0;i<road[up].size();i++)
		{
			vp=road[up][i];
			if(h[vp]||!w[up][vp]){continue;}
			h[vp]=h[up]+1;
			q.push(vp);
		}
	}
	return h[t]!=0;
}
int done(int now,int u)
{
	int res,sum=0;
	if(u==t){return now;}
	for(int i=0,v=road[u][0];i<road[u].size();i++,v=road[u][i])
	{
		if(h[v]-1!=h[u]||!w[u][v])
		{
			continue;
		}
		res=done(min(now,w[u][v]),v);
		w[u][v]-=res;
		w[v][u]+=res;
		sum+=res;
		if(sum==now){break;}
	}
	return sum;
}
void Ef()
{
	while(R()){memset(vis,0,sizeof(vis));vis[s]=1;ans+=done(2009062700,s);}
	cout<<ans;
}
signed main()
{
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v>>W;
		road[u].push_back(v);w[u][v]=W;
		road[v].push_back(u);w[v][u]=0;
	}
	Ef();
	return 0;
}
/*
1 3 40
2 1 30
2 3 20
4 3 20
4 2 30
(图请看题面)
咱们走g
*/

/*
2+2+3
*/
2021/1/7 17:52
加载中...