poj1273 最大流

原创 2012年03月25日 11:25:21

用的是EdmondsKarp

程序可以再优化的,懒得优化了

EdmondsKarp

#include <iostream>
#include<stdio.h>
#include <queue>
#include <limits>
#include <cstring>

using namespace std;
const int maxNode = 202;
int N = 201;//edge
int M = 201;//node
const int maxInt = numeric_limits<int>::max();

int g[maxNode][maxNode];
int f[maxNode][maxNode];
int residual[maxNode][maxNode];
int pre[maxNode];


bool BFS()
{
	queue<int> q;
	q.push(1);
	memset(pre,0,sizeof(int)*(M+1));
	int used[maxNode];
	memset(used,0,sizeof(int)*(M+1));
	
	used[1] = 1;
	while (!q.empty())
	{
		int curr = q.front();
		q.pop();
		for (int i=1;i<=M;++i)
		{
			if(residual[curr][i]>0 && !used[i])
			{
				pre[i] = curr;
				if(i==M)
					return true;

				q.push(i);
				used[i] = 1;
			}
		}
	}

	return false;
}

void EdmondsKarp()
{
	while (BFS())
	{
		int minF = maxInt;
		int curr = M;
		int beg=0,end = 0;
		while (curr!=1)
		{
			int preNode = pre[curr];
			if(minF > residual[preNode][curr])
			{
				minF = residual[preNode][curr];
				beg = preNode;
				end = curr;
			}
			curr = preNode;
		}

		curr = M;
		while (curr != 1)
		{
			int preNode = pre[curr];
			f[preNode][curr] +=minF;
			residual[preNode][curr] -=minF;
			residual[curr][preNode] = f[preNode][curr];

			curr = preNode;
		}
	}

	int sum=0;
	for (int i=1;i<M;++i)
	{
		sum +=f[i][M];
	}
	cout<< sum<<endl;
}

int main()
{
	
	while(scanf("%d%d",&N,&M)!=EOF)
	{
		
		for (int i=1;i<=M;++i)
		{
			memset(g[i],0,sizeof(int)*(M+1));
			memset(f[i],0,sizeof(int)*(M+1));
			memset(residual[i],0,sizeof(int)*(M+1));
		}
		for (int i=0;i<N;++i)
		{
			int start,end,capacity;
			scanf("%d%d%d",&start,&end,&capacity);
			g[start][end] += capacity;//这个地方太坑爹了,不是最大的容量吗,为毛要加呢
			residual[start][end] += capacity;
		}

		/*for (int i=1;i<=M;++i)
		{
			for(int j=1;j<=M;++j)
				cout<<g[i][j]<<" ";
			cout<<endl;
		}*/

		EdmondsKarp();
	}

	return 0;
}




下面是别人优化的比较好的


#include<iostream>

#include<cstring>
#include<queue>
using namespace std;
#define inf INT_MAX
int n,m,a[205][205],pre[205];
int bfs()
{
    queue<int>Q;
    Q.push(1);
    pre[1]=0;
    memset(pre,-1,sizeof(pre));
    int t,i;
    while(!Q.empty())
    {
       t=Q.front();
       Q.pop();
       for(i=2;i<=n;i++)
       if(pre[i]==-1&&a[t][i]>0)
       {
          pre[i]=t;
          Q.push(i);
          if(i==n)   return 1;
       }
    }
    return -1;
}
int maxflow()
{
    int res=0,ans,t;
    while(bfs()==1)
    {
       t=n;
       ans=inf;
       while(t!=1)
       {
           if(a[pre[t]][t]<ans)   ans=a[pre[t]][t];
           t=pre[t];
       }           
       res=res+ans;
       t=n;
       while(t!=1)
       {
           a[pre[t]][t]-=ans;
           a[t][pre[t]]+=ans;
           t=pre[t];
       }
    }
    return res;
}
int main()
{
     while(scanf("%d%d",&m,&n)!=EOF)
     {
          int i,j;
          memset(a,0,sizeof(a));
          for(i=0;i<m;i++)
          {
              int b,c,d;
              scanf("%d%d%d",&b,&c,&d);
              a[b][c]+=d;
          }
          printf("%d\n",maxflow());
     }
}


最大流效率更高的算法为:

Push-Relabel算法

Relabel-to-Front算法(http://cuitianyi.com/blog/%E6%B1%82%E6%9C%80%E5%A4%A7%E6%B5%81%E7%9A%84relabel-to-front%E7%AE%97%E6%B3%95/

Preflow-Push算法

Dinic算法(可以参考国家集训队 2007 王欣上《浅谈基于分层思想的网络流算法》)


【网络流之最大流】POJ1273-Drainage Ditche【模板题】

题目链接:http://poj.org/problem?id=1273 这是一道网络流的入门题,用来理解最大流很好。 这个题目我是看的bin神专门为我们这些歌渣渣写的最大流入门博客学的;可以去膜拜一下...
  • wlxsq
  • wlxsq
  • 2015年08月29日 11:21
  • 1422

最大流的理解以及dinic模板 poj1273

增广路以及残留网络的定义不再赘述了。算导上说的很清楚,证明也有,看懂了就知道怎么求最大流了。 而算导上提到的FF方法以及ek算法的伪代码中都是将流与残留容量分开储存,其实代码实现的时候我们只需存正反...
  • hitwhacmer1
  • hitwhacmer1
  • 2015年07月23日 11:43
  • 1285

【图割】最大流/最小割算法详解(Yuri Boykov and Vladimir Kolmogorov,2004 )

本博客主要翻译了Yuri Boykov and Vladimir Kolmogorov在2004年发表的改进最大流最小割算法用于计算机视觉的论文:An Experimental Comparison...
  • u011574296
  • u011574296
  • 2016年10月28日 15:34
  • 5964

poj 1273 最大流之最短路径增广法(EK)

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 71182   Accepted...
  • Summer__show_
  • Summer__show_
  • 2016年10月25日 22:17
  • 374

POJ 1273 Drainage Ditche(最大流模板题)

题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条水渠,给出这n条水渠所连接的池塘和所能流过的水量,求水渠中所能流过的水的最大容量. Edmonds-Karp算法: #incl...
  • CillyB
  • CillyB
  • 2017年05月02日 16:04
  • 200

poj1273完全不懂为何过的dinic最大流模板

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 67615 ...
  • ctrss
  • ctrss
  • 2016年05月17日 23:05
  • 156

poj1273 (最大流)

#include #include #include #include using namespace std ; const int maxn = 222 ; const int INF = 21...
  • No__stop
  • No__stop
  • 2014年05月14日 16:38
  • 545

最大流的基本算法(ff算法&&dinic算法&&push-rebeal算法)poj1273

最大流的基本概念有以下几点:               1.残存网络:即为一条管道被占用了一部分流量之后所剩下的流量。在网络流中,图被看为一个有向图,残存流量向量相加后永远不变。这一点有点像基尔霍夫...
  • aaron_1996
  • aaron_1996
  • 2015年08月08日 09:18
  • 1051

经典的最大流题POJ1273

百度文库花了5分下的 不过确实是自己需要的东西 经典的最大流题POJ1273 ——其他练习题 POJ3436 、 题意描述: 现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条...
  • huzhengnan
  • huzhengnan
  • 2012年07月20日 11:02
  • 6221

最大流--poj1273

裸的最大流,没什么好说的,第一次做,总结一下这次犯的错误。 首先queue开在了全局变量,然后就是没考虑重边,应该说还没接触过重边,以后要注意,据说写重边应该是没错,所以以后就写上,f[i][j]+...
  • u010660276
  • u010660276
  • 2013年08月12日 15:13
  • 390
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj1273 最大流
举报原因:
原因补充:

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