网络流

最大流(dinic算法)模板

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e18;
struct edge{ll v,cap,flow;};
ll n,m,s,t;
vector<ll> G[200+10];
vector<edge> edges;
ll d[200+10],cur[200+10];
void addedge(ll u,ll v,ll cap){
	edges.push_back((edge){v,cap,0});
	edges.push_back((edge){u,0,0});
	G[u].push_back(edges.size()-2);
	G[v].push_back(edges.size()-1);
}
bool vis[200+10];
bool bfs(){
	fill(vis,vis+1+n,false);
	queue<ll> que;
	que.push(s);
	vis[s]=true;
	d[s]=0;
	while(que.empty()==false){
		ll u=que.front();que.pop();
		for(ll i=0;i<G[u].size();i++){
			edge &e=edges[G[u][i]];
			if(vis[e.v]==false&&e.cap>e.flow){
				que.push(e.v);
				vis[e.v]=true;
				d[e.v]=d[u]+1;
			}
		}
	}
	return vis[t];
}
ll dfs(ll u,ll rq){
	if(u==t||rq==0)return rq;
	ll flow=0,f;
	for(ll &i=cur[u];i<G[u].size();i++){
		edge &e=edges[G[u][i]];
		if(d[u]+1==d[e.v]&&(f=dfs(e.v,min(rq,e.cap-e.flow)))>0){
			e.flow+=f;
			flow+=f;
			edges[G[u][i]^1].flow-=f;
			rq-=f;
			if(rq==0)break;
		}
	}
	return flow;
}
ll maxflow(){
	ll flow=0;
	while(bfs()){
		fill(cur,cur+1+n,0);
		flow+=dfs(s,inf);
	}
	return flow;
}
int main(){
	cin >> n >> m >> s >> t;
	for(ll i=1;i<=m;i++){
		ll u,v,w;
		cin >> u >> v >> w;
		addedge(u,v,w);
	}
	cout << maxflow() << endl;
	return 0;
}

注意:数据多测的时候,不需要另外清空vis、d、cur数组,因为cur会在maxflow函数中被清空,vis会在bfs函数中被清空,d原来的值会在赋值的时候被覆盖掉,也就是说,只需清空edges、G数组即可(使用vector的clear方法)。

posted @ 2023-11-15 13:04  Alric  阅读(12)  评论(0编辑  收藏  举报