Dinic算法vector样例过不了求调
查看原帖
Dinic算法vector样例过不了求调
333800
qip101楼主2022/12/31 12:30
#include <bits/stdc++.h> 
#define MAXN 100100
#define MAXM 2023
#define INF 2147483647
using namespace std;
long long n,m,s,t,ans;
long long dis[MAXM];
struct edge{
	int v,w;
};
vector <edge> G[MAXN];
inline void add_edge(int u,int v,int w)
{
	G[u].push_back((edge){v,w});
	G[v].push_back((edge){u,0});
}
inline bool BFS()
{
	memset(dis,INF,sizeof(dis));
	queue <int> q;
	q.push(s);
	dis[s]=0;
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=0;i<G[x].size();i++)
		{
			int to=G[x][i].v;
			if(G[x][i].w>0 && dis[to]==INF)
			{
				q.push(to);
				dis[to]=dis[x]+1;
				if(to==t)
					return true;
			}
		}
	}
	return false;
}
int DFS(int x,int sum)
{
	if(x==t) 
		return sum;
	long long k,res=0;
	for(int i=0;i<G[x].size();i++)
	{
		int to=G[x][i].v;
		if(G[x][i].w>0 && dis[to]==dis[x]+1)
		{
			k=DFS(to,min(sum,G[x][i].w));
			if(k==0)
				dis[to]=INF;
			G[x][i].w-=k;
			G[x][i].w+=k;
			res+=k;
			sum-=k;
		}
	}
	return res;
}
void Dinic() 
{
	while(BFS()==true)
		ans+=DFS(s,INF);
}
int main()
{
	//freopen("Dinic.in","r",stdin);
	//freopen("Dinic.out","w",stdout);
	ios::sync_with_stdio(false);
	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;
		add_edge(u,v,w);
	}
	Dinic();
	cout << ans << endl;
	return 0;
}
2022/12/31 12:30
加载中...