解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图。

看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也体现了邻接表的优越性?

edge结构体的第三个变量为from的下标。

模板一:

#include<bits/stdc++.h>
#define MAX_V 17
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,m,s,t;
struct edge{
int to,cap,rev;
};
vector<edge>G[MAX_V];
bool used[MAX_V];
void add_edge(int from,int to,int cap){
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,,G[from].size()-});
}
int dfs(int v,int t,int f){
if(v==t)return f;
used[v]=true;
for(int i=;i<G[v].size();i++){
edge &e=G[v][i];
if(!used[e.to]&&e.cap>){
int d=dfs(e.to,t,min(f,e.cap));
if(d>){
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
} int max_flow(int s,int t){
int flow=;
while(){
memset(used,,sizeof used);
int f=dfs(s,t,inf);
if(f==) return flow;
flow+=f;
}
return flow;
} int main(){
int T,u,v,f;
scanf("%d",&T);
for(int ca=;ca<=T;ca++){
memset(G,,sizeof G);
scanf("%d%d",&n,&m);
for(int i=;i<m;i++){
scanf("%d%d%d",&u,&v,&f);
add_edge(u,v,f);
}
s=,t=n;
int ans=max_flow(s,t);
printf("Case %d: %d\n",ca,ans);
}
return ;
}

模板二:dinic,187ms,比第一个快,在层次图上进行增广,且进行了当前弧优化。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX_V 17
using namespace std;
typedef long long ll;
struct edge{int to,cap,rev;};//终点,容量,反向边
vector<edge>G[MAX_V];
int level[MAX_V],iter[MAX_V];
int n,m,s,t;
void add_edge(int from,int to,int cap){
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,,G[from].size()-});
}
void bfs(int s){
memset(level,-,sizeof level);
queue<int>que;
level[s]=;
que.push(s);
while(!que.empty()){
int v=que.front();que.pop();
for(int i=;i<G[v].size();i++){
edge &e=G[v][i];
if(e.cap>&&level[e.to]<){
level[e.to]=level[v]+;
que.push(e.to);
}
}
}
} int dfs(int v,int t,int f){
if(v==t) return f;
for(int &i=iter[v];i<G[v].size();i++){
edge &e=G[v][i];
if(e.cap>&&level[v]<level[e.to]){
int d=dfs(e.to,t,min(f,e.cap));
if(d>){
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
} int max_flow(int s,int t){
int flow=;
while(){
bfs(s);
if(level[t]<) return flow;
memset(iter,,sizeof iter);
int f;
while((f=dfs(s,t,inf))>){
flow+=f;
}
}
return flow;
} int main(){
int T,u,v,f;
scanf("%d",&T);
for(int ca=;ca<=T;ca++){
memset(G,,sizeof G);
memset(iter,,sizeof iter);
scanf("%d%d",&n,&m);
for(int i=;i<m;i++){
scanf("%d%d%d",&u,&v,&f);
add_edge(u,v,f);
}
s=,t=n;
int ans=max_flow(s,t);
printf("Case %d: %d\n",ca,ans);
}
return ;
}

[hdu3549]Flow Problem(最大流模板题)的更多相关文章

  1. hdu-3549 Flow Problem---最大流模板题(dinic算法模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3549 题目大意: 给有向图,求1-n的最大流 解题思路: 直接套模板,注意有重边 传送门:网络流入门 ...

  2. hdu - 3549 Flow Problem (最大流模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=3549 Ford-Fulkerson算法. #include <iostream> #include ...

  3. hdu 3549 Flow Problem 最大流问题 (模板题)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  4. Flow Problem(最大流模板)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  5. HDU-3549Flow Problem 最大流模板题

    传送门 这里是Ford-Fulkerson写的最大流模板 #include <iostream> #include <cstdio> #include <algorith ...

  6. HDU3549:Flow Problem(最大流入门EK)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> ...

  7. HDU-3549 最大流模板题

    1.HDU-3549   Flow Problem 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 3.总结:模板题,参考了 http://ww ...

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

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

  9. Hdu3549 Flow Problem 2017-02-11 16:24 58人阅读 评论(0) 收藏

    Flow Problem Problem Description Network flow is a well-known difficult problem for ACMers. Given a ...

随机推荐

  1. 混沌相关blog+节选

    <数字化定量分析:一致性获利法时间跨度的定量研究>    http://blog.sina.com.cn/s/blog_82cf83d50101a41q.html     ——  用60分 ...

  2. 经典c语言题

    1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个“标 ...

  3. WampServer修改MySQL密码的问题

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就 一步步来操作. 首先,通过WAMP打开mysql控制台.     提示输入原密码,如果是空,直接按 ...

  4. centos 中 增强web服务器安全

    一.修改ssh连接的默认端口: 1.1 用root 连接进入系统: 1.2 修改ssh的配置文件 #vi /etc/ssh/sshd_config 在13行找到#Port 22 (默认端口22) 1. ...

  5. nginx location 语法

    location 语法location 有”定位”的意思, 根据Uri来进行不同的定位.在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.比如, 碰到.p ...

  6. 《python基础教程(第二版)》学习笔记 字典(第4章)

    <python基础教程(第二版)>学习笔记 字典(第4章)创建字典:d={'key1':'value1','key2':'value2'}lst=[('key1','value1'),(' ...

  7. LUM使用常规命令

    查看日志 tail -f /var/log/messages LUM使用常规命令再列出一下######------ 软件操作方法:* 关闭LUM及所有组件:lu-stop* 启动LUM及所有组件:lu ...

  8. EntityFramework 学习 一 Table-Valued Function in Entity Framework 5.0

    USE [SchoolDB] GO /****** Object: UserDefinedFunction [dbo].[GetCourseListByStudentID] */ SET ANSI_N ...

  9. Java -- 键盘输入 Scanner, BufferedReader。 系统相关System,Runtime。随机数 Randrom。日期操作Calendar

    1. Scanner 一个基于正则表达式的文本扫描器,他有多个构造函数,可以从文件,输入流和字符串中解析出基本类型值和字符串值. public class Main { public static v ...

  10. 韩顺平Linux

    shutdown -h now 立刻进行关机 shutdown -r now 立即重启 reboot同上. 用户登录尽量少用root账号登录,因为它是系统管理员,最大的管理权限,避免操作失误. 可以利 ...