poj1273 最大流
用的是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 最大流相关推荐
- 2018 Spring Training 图论 合集
https://cn.vjudge.net/contest/229893#overview 题目链接 A.Uva 302 判断能不能走就是一个一笔画问题,(欧拉回路),因为题目要求是要回到原点,因此所 ...
- POJ1273 Drainage Ditches(最大流基础题)
在讨论问题之前先说一句,如果你这题WA了很久,请先看以下一句话,或许可以省下你翻遍全文的时间: 注意考虑重边.(是不是想大呼[Bi-]?传送门:http://poj.org/problem?id=12 ...
- HDU 1532 Drainage Ditches(poj1273)【E-K 最大流】
第一道最大流题. 水题,裸题. Sample Input 5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10 Sample Output 50 输入m n, m是边数,n是点 ...
- POJ-1273(最大流-Augment Path,EK,BFS)
1273:Drainage Ditches 查看 提交 统计 提问 时间限制: 1000ms 内存限制: 65536kB 描述 Every time it rains on Farmer John's ...
- (通俗易懂小白入门)网络流最大流——EK算法
网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...
- 最大流算法之三:ISAP
最大流算法之三:ISAP <转> (2009-08-14 19:24:27) 转载▼ 标签: it 分类: 理论 通常的 SAP 类算法在寻找增广路时总要先进行 BFS,BFS 的最坏情况 ...
- (网络流)最大流复习
今天是2017/5/10,DCDCBigBig的第三篇博文 这段时间先把图论的一些算法复习一下,过段时间再搞数据结构吧... 最大流 基本概念 最大流问题(Maximum Flow Problem)是 ...
- 最大流算法-ISAP
引入 最大流算法分为两类,一种是增广路算法,一种是预留推进算法.增广路算法包括时间复杂度\(O(nm^2)\)的EK算法,上界为\(O(n^2m)\)的Dinic算法,以及一些其他的算法.EK算法直接 ...
- stream流对象的理解及使用
我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...
最新文章
- GIS+=地理信息+云计算技术——Spark集群部署
- Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)
- 支付宝PC即时到账和手机网站支付同步
- php 数组交集函数,PHP array_intersect_uassoc 函数
- python3多进程 进程池 协程并发
- ssm整合之四 分页
- 在Word里使用部分正则表达式
- Suse系统用户不能登录报错
- c语言实现协议层层消息,纯C语言实现面向对象分析与示例分享.pdf
- 微信小程序 this.data与this.setData
- ES6面试题(参考文档)
- 肖哥所有课程/HCNA HCNP/安全/云计算/虚拟化/linux/视频教程/资料软件下载链接
- 【Axure原型模板】APP原型设计通用模板 移动端通用原型模板
- ArcGIS 10.7基础:三种栅格影像裁剪操作
- 浙江大学黄杨思博计算机学院,竺可桢学院2010-2011学年荣誉称号发文名单
- ValueError X has 2 features, but LogisticRegression is expecting 5 features as input
- MyBatis返回Map时值为null的字段会丢失
- Python实现自省的方法有哪些?
- 【文献翻译】MDC-Checker:一种新的多域配置网络风险评估框架
- matlab画线的形状颜色