ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网络流模板

2020-12-06 00:02:35  阅读:163  来源: 互联网

标签:EK int flow 网络 edges maxn include 模板


刘汝佳的EK板子.. 懂的都懂

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#define INF 20000000
#define maxn 205
using namespace std;
struct Edge{
	int from,to,cap,flow;
	Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f) {
	}
};
struct EK{ int n,m;
	int a[maxn],p[maxn];
	vector<Edge> edges;vector<int> G[maxn];
	void init(int n){
		for(int i=0;i<n;i++) G[i].clear();
		edges.clear();
	}
	
	void ADDedge(int from,int to,int cap){
		edges.push_back(Edge(from,to,cap,0));
		edges.push_back(Edge(to,from,0,0));
		int m=edges.size();
		G[from].push_back(m-2);
		G[to].push_back(m-1);
	}
	int Maxflow(int s,int t){
		int flow=0;
		for(;;){
			memset(a,0,sizeof(a));
			queue<int> Q;Q.push(s);a[s]=INF;
			while(!Q.empty()){
				int x=Q.front();Q.pop();
				for(int i=0;i<G[x].size();i++){
					Edge &e=edges[G[x][i]];
					if(!a[e.to]&&e.cap>e.flow){
						p[e.to]=G[x][i];
						a[e.to]=min(a[x],e.cap-e.flow);
						Q.push(e.to);
					}
				} if(a[t]) break;
			}
			if(!a[t]) break;
			for(int u=t;u!=s;u=edges[p[u]].from){
				edges[p[u]].flow+=a[t];
				edges[p[u]^1].flow-=a[t];
			}
			flow+=a[t];
		}
		return flow; 
	}
};
int main(){ int n,m,i,j,u,v,w,ans,s,t;EK ek;
while(scanf("%d%d",&m,&n)==2){
	ek.init(n);
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		ek.ADDedge(u,v,w);
	}
	ans=ek.Maxflow(1,n);cout<<ans<<endl;
}
return 0;}

 

标签:EK,int,flow,网络,edges,maxn,include,模板
来源: https://blog.csdn.net/qq_36018057/article/details/110729453

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有