【最大流之EdmondsKarp算法】【HDU1532】模板题
题意:裸的最大流,什么是最大流,参考别的博客
运用复杂度最高的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】模板题的更多相关文章
- HDU1532 网络流最大流【EK算法】(模板题)
<题目链接> 题目大意: 一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量:首先输入两个数n,m ;n为排水管道的数量,m为节点的数量 ...
- hdu 3549 Flow Problem【最大流增广路入门模板题】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...
- 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 ...
- 最大流dicnic——hdu1532模板题
#include<bits/stdc++.h> using namespace std; #define maxn 1005 #define ll long long const ll i ...
- 关于最大流的EdmondsKarp算法详解
最近大三学生让我去讲课,我就恶补了最大流算法,笔者认为最重要的是让学弟学妹们入门,知道算法怎么来的?为什么是这样?理解的话提出自己的改进,然后再看看Dinic.SAP和ISAP算法….. 一.概念引入 ...
- UVA 10000 Longest Paths (SPFA算法,模板题)
题意:给出源点和边,边权为1,让你求从源点出发的最长路径,求出路径长度和最后地点,若有多组,输出具有最小编号的最后地点. #include <iostream> #include < ...
- POJ 1273 - Drainage Ditches - [最大流模板题] - [EK算法模板][Dinic算法模板 - 邻接表型]
题目链接:http://poj.org/problem?id=1273 Time Limit: 1000MS Memory Limit: 10000K Description Every time i ...
- POJ2417 Discrete Logging【BSGS】(模板题)
<题目链接> 题目大意: P是素数,然后分别给你P,B,N三个数,然你求出满足这个式子的L的最小值 : BL== N (mod P). 解题分析: 这题是bsgs算法的模板题. #incl ...
- POJ 3348 Cows | 凸包模板题
题目: 给几个点,用绳子圈出最大的面积养牛,输出最大面积/50 题解: Graham凸包算法的模板题 下面给出做法 1.选出x坐标最小(相同情况y最小)的点作为极点(显然他一定在凸包上) 2.其他点进 ...
随机推荐
- UILocalNotification
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- A Simple Problem with Integers(100棵树状数组)
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- java web分页查询初试
ssh2分页查询初试,放着记录学习一下. entity:student.java: package com.zte.entity; /** * 数据持久化,跟数据库的的相应的表的字段是对应的. * * ...
- UVA10199- Tourist Guide(割点)
题目链接 题意: 给出一张无向图,找出割点,字典序输出割点的名字. 思路:简单的割点的求解,用map映射.easy输出. 代码: #include <iostream> #include ...
- 关于Node.js, Jade一点小小的介绍。
本文出自:http://blog.csdn.net/svitter node.js大家知道的可能比較多,可是jade大家可能就不知道了.. GFW封杀掉google以后.今天在百度上找了好久也没有找到 ...
- Android开发最佳学习路线图
为了帮助大家更好的学习Android开发的相关知识,尚观4G智能操作系统研究室(www.up4g.com)为大家制作下面学习路线图:希望能帮助到广大的android爱好者. 在開始之前我们 ...
- 【考虑周全+数学变形】【11月赛】Is it a fantastic matrix?
Is it a fantastic matrix? Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/ ...
- Mongodb中Sharding集群
随着mongodb数据量的增多,可能会达到单个节点的存储能力限制,以及application较大的访问量也会导致单个节点无法承担,所以此时需要构建集群环境,并通过sharding方案将整个数据集拆分成 ...
- NDK下 将Platinum SDK 编译成so库 (android - upnp)
Platinum UPnP SDK 是一个跨平台的C++库,利用该库,可以很容易就构建出DLNA/UPnP控制点(DLNA/UPnP Control Point)和DLNA/UPnP设备(DLNA/U ...
- 影响布局的inline-block的空白符的问题
昨天切页面时,进行布局时,想改变以下方法换换口味,所以就抛弃了float方法,采用了display:inline-block方法,没想到却随之而来的带来了一个想不通的问题,那就是空白.废话不多说,上代 ...