题意:裸的最大流,什么是最大流,参考别的博客

运用复杂度最高的EK算法 O(M*N),模板来自紫书

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <queue>
#define INF 0x3f3f3f3f
#define oo 0x13131313
const int maxn=200+5;
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 EdmondsKarp{
int n,m;
vector<Edge> edges; //边集数组,边数*2
vector<int> G[maxn]; //邻接表
int a[maxn]; //起点到i的可改进量
int p[maxn]; //最短路树上p的弧编号
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)); //反向弧
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;
// while(!Q.empty()) Q.pop();
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;
}
};

完整代码:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <queue>
#define INF 0x3f3f3f3f
#define oo 0x13131313
const int maxn=200+5;
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 EdmondsKarp{
int n,m;
vector<Edge> edges; //边集数组,边数*2
vector<int> G[maxn]; //邻接表
int a[maxn]; //起点到i的可改进量
int p[maxn]; //最短路树上p的弧编号
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)); //反向弧
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;
// while(!Q.empty()) Q.pop();
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;
}
};
EdmondsKarp A;
int N;
void File()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
void input()
{
int a,b,c;
for(int i=1;i<=N;i++)
{
scanf("%d%d%d",&a,&b,&c);
A.AddEdge(a,b,c);
}
}
void solve()
{
int ans=0;
ans=A.Maxflow(1,A.n);
printf("%d\n",ans);
}
int main()
{
// File();
A.init(maxn);
while(scanf("%d%d",&N,&A.n)!=EOF)
{
input();
solve();
A.init(maxn); //注意用maxn 去初始化!
}
return 0;
}

【最大流之EdmondsKarp算法】【HDU1532】模板题的更多相关文章

  1. HDU1532 网络流最大流【EK算法】(模板题)

    <题目链接> 题目大意: 一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量:首先输入两个数n,m ;n为排水管道的数量,m为节点的数量 ...

  2. hdu 3549 Flow Problem【最大流增广路入门模板题】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...

  3. hdu 2586 How far away ?(LCA - Tarjan算法 离线 模板题)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 最大流dicnic——hdu1532模板题

    #include<bits/stdc++.h> using namespace std; #define maxn 1005 #define ll long long const ll i ...

  5. 关于最大流的EdmondsKarp算法详解

    最近大三学生让我去讲课,我就恶补了最大流算法,笔者认为最重要的是让学弟学妹们入门,知道算法怎么来的?为什么是这样?理解的话提出自己的改进,然后再看看Dinic.SAP和ISAP算法….. 一.概念引入 ...

  6. UVA 10000 Longest Paths (SPFA算法,模板题)

    题意:给出源点和边,边权为1,让你求从源点出发的最长路径,求出路径长度和最后地点,若有多组,输出具有最小编号的最后地点. #include <iostream> #include < ...

  7. POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]

    题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...

  8. POJ2417 Discrete Logging【BSGS】(模板题)

    <题目链接> 题目大意: P是素数,然后分别给你P,B,N三个数,然你求出满足这个式子的L的最小值 : BL== N (mod P). 解题分析: 这题是bsgs算法的模板题. #incl ...

  9. POJ 3348 Cows | 凸包模板题

    题目: 给几个点,用绳子圈出最大的面积养牛,输出最大面积/50 题解: Graham凸包算法的模板题 下面给出做法 1.选出x坐标最小(相同情况y最小)的点作为极点(显然他一定在凸包上) 2.其他点进 ...

随机推荐

  1. nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

    Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Wi ...

  2. Android 四大组件之 BroadcastReceiver

    0  简介        BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的 广播.        在Android系统中,广播体现在方方面面,例 ...

  3. Cocos2d-x游戏开发CCBAnimationManager控制动画

    CocosBuilder能方便的编辑各种动画.大部分动画都是以独立片段的形式存在的. 须要由程序来控制何时播放. 管理ccbi文件的动画播放有个专门的类:CCBAnimationManager 大致的 ...

  4. linux下php扩展curl的安装

    方法一 安装cURL wget http://curl.haxx.se/download/curl-7.17.1.tar.gz tar -zxf curl-7.17.1.tar.gz ./config ...

  5. 安装mysql时出错。无法初始化。 libstdc++.so.5

    ./bin/mysqld: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: ...

  6. 如何合并相同数据并转置(mysql)实现

    上次参加天猫大数据竞赛 是预测用户会买哪些牌子给用户推荐 拥有的字段 user_id,brand_id 最后要转成如下格式,比如用户1,要给他推荐2,3,4号品牌 原来的数据是 user_id,bra ...

  7. makefile常用指令和常见变量。

    引用文章A:http://blog.csdn.net/liang13664759/article/details/1771246 文章介绍:非常详细的文章,讲解上都是比较基础的知识. 本文可能会持续更 ...

  8. GDAL显示线性shp文件

    http://pan.baidu.com/s/1qWIDphU  (工程文件在vs2008中编写) 1.使用到的技术 GDAL:读取矢量数据 GDI:    绘制矢量数据 2.详细解释 GDI绘图: ...

  9. Windows下安装PHP扩展及资源下载地址(memcached为例)

    官方下载的php安装包ext目录里以经包含了常用的php扩展,但某些情况下并不能满足我们项目需求,比如memcache扩展就不在官方的php安装包里.这时就需要我们自己去下载安装. 本文列出php官方 ...

  10. Hadoop配置文件-core-site.xml

     name value  Description   fs.default.name hdfs://hadoopmaster:9000 定义HadoopMaster的URI和端口  fs.checkp ...