最大流板子奇妙算法求证明时间复杂度
查看原帖
最大流板子奇妙算法求证明时间复杂度
649095
幻想繁星NM 猫猫可爱楼主2023/11/29 16:30
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,s,t;
long long ans;
vector<vector<int> >e(202);
vector<vector<int> >dis(202,vector<int>(202));
vector<bool>vis(202);
vector<int>vis2(202),fa(202);
priority_queue<pair<int,pair<int,int> > >q;
bool bfs()
{
	for(int i=1;i<=n;i++)
		vis[i]=vis2[i]=fa[i]=0;
	while(!q.empty())
		q.pop();
	for(int v:e[s])
		if(dis[s][v]>0)
			q.push(make_pair(dis[s][v],make_pair(s,v)));
	while(!q.empty())
	{
		pair<int,pair<int,int> > nw=q.top();
		q.pop();
		if(vis[nw.second.second]==1)
			continue;
		vis[nw.second.second]=1;
		vis2[nw.second.second]=nw.first;
		fa[nw.second.second]=nw.second.first;
		if(nw.second.second==t)
			return 1;
		for(int v:e[nw.second.second])
			if(dis[nw.second.second][v]>0)
				q.push(make_pair(min(dis[nw.second.second][v],vis2[nw.second.second]),make_pair(nw.second.second,v)));
	}
	return 0;
}
void slove()
{
	int nw=t;
	ans+=vis2[t];
	while(nw!=s)
	{
		dis[fa[nw]][nw]-=vis2[t];
		dis[nw][fa[nw]]+=vis2[t];
		nw=fa[nw];
	}
	return;
}
main()
{
	read(n,m,s,t);
	for(int i=1,u,v,w;i<=m;i++)
	{
		read(u,v,w);
		e[u].push_back(v);
		e[v].push_back(u); 
		dis[u][v]+=w;
	}
	while(bfs())
		slove();
	write(ans);
    return 0;
}
2023/11/29 16:30
加载中...