博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1532 网络流最大流【EK算法】(模板题)
阅读量:4705 次
发布时间:2019-06-10

本文共 1382 字,大约阅读时间需要 4 分钟。

<>

题目大意:

一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量;首先输入两个数n,m ;n为排水管道的数量,m为节点的数量,接下来就是n行数,每一行分为x1,x2,x3;x1,x2为节点的序号,x3为流量;然后问从1号节点到m号节点的最大流是多少?

解题分析:

网络流最大流裸题,下面用的是EK算法,bfs起搜索增广路径的作用,EK算法比较难理解的地方就是反向边的构造。

#include 
#include
#include
#include
#include
#include
using namespace std;int n,m;int map1[205][205];int pre[205];int vis[205];int s,t;bool BFS() //bfs搜索增广路径 { int i,cur; queue
q; memset(pre,0,sizeof(pre)); memset(vis,0,sizeof(vis)); vis[s]=1; q.push(s); while(!q.empty()) { cur=q.front(); q.pop(); if(cur==t) return 1; //如果搜索到终点,说明搜到一条增广路,return 1; for(i=1; i<=n; i++) { if(!vis[i] &&map1[cur][i]) { q.push(i); pre[i]=cur; vis[i]=1; } } } return 0; //没有搜到一条完整的增广路 }int Max_flow(){ int i,ans=0; while(1) { if(!BFS()) return ans; //如果找不到增广路径了,此时ans算得的就是最大流 int Min=0x3f3f3f3f; for(i=t; i!=s; i=pre[i]) //遍历该条增广路径 Min=min(Min,map1[pre[i]][i]); //找增广路径上的最小流量 for(i=t; i!=s; i=pre[i]) { map1[pre[i]][i]-=Min; //该条增广路径上的每条边都减去 min map1[i][pre[i]]+=Min; //该条增广路径上每条边修改反向边,反向边起到一种退流回溯的作用 } ans+=Min; }}int main(){ while(scanf("%d %d",&m,&n)!=EOF) { memset(map1,0,sizeof(map1)); s=1,t=n; while(m--) { int u,v,c; scanf("%d%d%d",&u,&v,&c); map1[u][v]+=c; } printf("%d\n",Max_flow()); } return 0;}

 

 

2018-08-14

转载于:https://www.cnblogs.com/00isok/p/9474504.html

你可能感兴趣的文章
iOS10 UI教程视图和子视图的可见性
查看>>
FindChildControl与FindComponent
查看>>
中国城市json
查看>>
android下载手动下载Android SDK
查看>>
C++学习:任意合法状态下汉诺塔的移动(原创)
查看>>
leetcode133 - Clone Graph - medium
查看>>
UNET学习笔记2 - 高级API(HLAPI)
查看>>
"ORA-00942: 表或视图不存在 "的原因和解决方法[转]
查看>>
Oauth支持的5类 grant_type 及说明
查看>>
C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)
查看>>
W3100SM-S 短信猫代码发送 上
查看>>
netty接收大文件的方法
查看>>
软件工程设计之四则运算
查看>>
SpringMVC @ResponseBody 406
查看>>
Partial Tree UVALive - 7190(完全背包)
查看>>
Ubuntu安装搜狗拼音教程
查看>>
Happy Number
查看>>
Sqlserver 系统视图简单说明
查看>>
vue中ESlint报错
查看>>
NetCore2.0 RozarPage自动生成增删改查
查看>>