poj1273【最大流入门】

原创 2016年05月31日 21:07:24

Drainage Ditches
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 67890   Accepted: 26235

Description

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch.
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network.
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.

Input

The input includes several cases. For each case, the first line contains two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.

Output

For each case, output a single integer, the maximum rate at which water may emptied from the pond.

Sample Input

5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10

Sample Output

50

题意:

有n个池塘(从1到n开始编号,1为源点,n为汇点),m条水渠,给出这m条水渠端点和所能流过的最大流量,

求从源点到汇点能流过的最大流量。(1->n);



超级水的最大流问题

Dinic算法

当成模板啦~


#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <queue>

#define maxn 105
#define INF 0x3f3f3f3f
using namespace std;

struct Edge{
	int from,to,cap,flow;
};

struct Dinic {
	int n,m,s,t;
	vector<Edge> edges;
	vector<int> G[maxn];		//邻接表 
	bool vis[maxn];				//BFS使用 
	int d[maxn];				//从起点到i的距离 
	int cur[maxn];				//当前弧下标 
	
	void init(int n){
		this->n=n;
		for(int i=1;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){from,to,cap,0} );
		m=edges.size();
		G[from].push_back(m-2);
		G[to].push_back(m-1);
	}
	
	bool BFS(){
		memset(vis,0,sizeof(vis));
		queue<int> Q;
		Q.push(s);
		d[s]=0;
		vis[s]=1;
		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(!vis[e.to]&&e.cap>e.flow){	//只考虑残量网络中的图 
					vis[e.to]=1;
					d[e.to]=d[x]+1;
					Q.push(e.to); 
				}
			}
		}
		return vis[t];
	} 
	int DFS(int x,int a){
		if(x==t||a==0)	return a;
		int flow=0,f;
		for(int &i = cur[x];i<G[x].size();i++){
			Edge &e =edges[G[x][i]];
			if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow))>0)){
				e.flow+=f;
				edges[G[x][i]^1].flow-=f;
				flow+=f;
				a-=f;
				if(a==0)	break;
			}
		}
		return flow;
	} 
	
	int Maxflow(int s,int t){
		this->s=s;
		this->t=t;
		int flow=0;
		while(BFS()){
			memset(cur,0,sizeof(cur));
			flow+=DFS(s,INF);
		}
		return flow;
	}


	vector<int> Mincut(){		//最小割割边 
		BFS();
		vector<int> v;
		for(int i=0;i<edges.size();i++){
			Edge &e=edges[i];
			if(vis[e.from] && !vis[e.to] && e.cap>0)	
				v.push_back(i);
		} 
		return v;
	}
};


Dinic solver;
int main(){
	int n,m;
	while(scanf("%d%d",&m,&n)!=EOF){	//边,点 
		solver.init(n);
		int x,y,z;
		for(int i=0;i<m;i++){
			scanf("%d%d%d",&x,&y,&z);
			solver.AddEdge(x,y,z);
		} 
		int ans=solver.Maxflow(1,n);
		printf("%d\n",ans);
	} 
	
	
	return 0;
} 









版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj 1273 最大流入门

题意非常简单易懂,算是网络流最简单入门题目 有N条排水管道,M个结点(1为源点,M为汇点) 最大容量已知 求最大流 仿照SAP的写法 #include #include #inclu...
  • cfzjxz
  • cfzjxz
  • 2013年01月06日 16:01
  • 303

POJ 1273 最大流入门题 Edmonds_Karp算法

Edmonds_Karp算法步骤: 循环{ 初始化 寻找增广路 没有则退出 根据增广路,更新flow } #include #include #include #inc...

NYOJ 323 && HDU 1532 && POJ 1273 Drainage Ditches (网络流之最大流入门)

链接:click here 题意:给出n个河流,m个点,以及每个河流的流量,求从1到m点的最大流量。 思路:最裸的网络流题目  意思就是求从源点到汇点的最大流。 第一道网络流,一边看着书上的介绍,一...

poj 1273 Drainage Ditches 网络流最大流入门 ford-fulkerson

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70072 ...

POJ 1273 Drainage Ditches 最大流入门题

一道基础的网络流中的最大流问题 题目链接:http://poj.org/problem?id=1273 利用最大流定理:残留网络上找不到增广路径,则当前流为最大流;反之,如果当前流不为最大流,则一...

POJ 1273 Drainage Ditches(最大流入门)

POJ 1273 Drainage Ditches(最大流入门) http://poj.org/problem?id=1273 题意:        现在有m个池塘(从1到m开始编号,1为源点,...

POJ 1273 Drainage Ditches (最大流入门~)

昨天一直没看懂EK算法,今天早上用gdb调试了很久终于知道咋回事啦~~给个链接先,我就是在这里看到的: http://www.wutianqi.com/?p=3107 #include #i...
  • moon_CY
  • moon_CY
  • 2017年08月07日 10:20
  • 63

最大流入门 之 poj 1273

//  [5/7/2014 Sjm] /* 图论之最大流: Ford-Fulkerson方法 dfs 实现 第一次接触网络流的题目,卡了好久。。。最后终于理解了代码,自己能敲出来了。。。 教训: (体...

[网络流入门,简单题]poj1273Drainage Ditches最大流

最大流第一题.哦也~~~~~~~~~凭自己的理解写的代码,多做点题,ying

HDU1532/POJ1273 Drainage Ditches 最大排水量 网络最大流 EK、Dinic、ISAP算法

题意:为了不让水淹三叶草,现在修了很多排水管,现在问从源点到汇点的最大排水量。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj1273【最大流入门】
举报原因:
原因补充:

(最多只允许输入30个字)