欢迎访问我的pat顶级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/86751676

题目描述

算法设计

这道题是图论的最大流问题,关于该问题的解决算法有很多,比较容易掌握的是Edmonds-Karp算法。关于该问题和Edmonds-Karp算法展开起来比较复杂,读者可自行查阅相关资料。我在本博客中直接附上解决本题的代码,代码参考了刘汝佳的《算法竞赛与入门经典(第2版)》关于Edmonds-Karp算法的实现,其中添加了足够充分的注释,读者也可以参考我的代码进行理解。

注意点

图中边的描述最多有500行,最多有1000个点,所以相关数组至少要开到1000

C++代码

#include<bits/stdc++.h>
using namespace std;
struct Edge{//边类int from,to,cap,flow;Edge(int f,int t,int c,int fl):from(f),to(t),cap(c),flow(fl) {}
};
unordered_map<string,int>trans;//将字符串转换为数字,由0开始编号
vector<Edge>edges;//储存边
vector<int>graph[1005];//整个图,其中graph[i][j]表示结点i的第j条边在edges数组中的序号
int a[1005],p[1005];//a数组表示源点到结点a[i]的残量,p数组表示最短路树上到达结点p[i]的边在edges数组中的序号
void insertEdge(string&from,string&to,int cap){//插入边,起点为from,终点是to,容量为capif(trans.find(from)==trans.end())//将起点转换为数字编号trans.insert({from,trans.size()});if(trans.find(to)==trans.end())//将终点转换为数字编号trans.insert({to,trans.size()});int f=trans[from],t=trans[to];//获取起点、终点的数字编号graph[f].push_back(edges.size());//在图中插入该边edges.push_back(Edge(f,t,cap,0));graph[t].push_back(edges.size());//在图中插入该边的反向边edges.push_back(Edge(t,f,0,0));
}
int MaxFlow(int s,int t){//最大流算法,s为源点,t为汇点int flow=0;//最大流量while(true){memset(a,0,sizeof(a));//将源点到达每个结点的残量初始化为0//广度优先遍历查找从源点到达汇点的增广路queue<int>q;q.push(s);a[s]=INT_MAX;//起点的残量置为无穷大while(!q.empty()){int x=q.front();q.pop();for(int i:graph[x]){//遍历以x为起点的边Edge&e=edges[i];if(a[e.to]==0&&e.cap>e.flow){//当前边的终点的残量为0且容量大于流量p[e.to]=i;//更新到达该终点的边的编号a[e.to]=min(a[x],e.cap-e.flow);//更新源点到该终点的残量q.push(e.to);//压入队列}}if(a[t]!=0)//终点的残量不为零,跳出循环break;}if(a[t]==0)//终点的残量为零,表示不存在增广路了,跳出外层死循环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;
}
int main(){string from,to;int n,cap;cin>>from>>to>>n;trans[from]=0;trans[to]=1;while(n--){cin>>from>>to>>cap;insertEdge(from,to,cap);}printf("%d",MaxFlow(0,1));return 0;
}

pat顶级1003 Universal Travel Sites (35 point(s))相关推荐

  1. PAT顶级 1003 Universal Travel Sites (35分)(最大流)

    题目链接: 1003 Universal Travel Sites (35分) 思路: 题目问stationstationstation的最小容量,变相就是问最多能一次性出发多少人,使得过程中不会超过 ...

  2. 1003 Universal Travel Sites (35 分)(C++)

    PAT顶级题解目录​​​​​​​ After finishing her tour around the Earth, CYLL is now planning a universal travel ...

  3. 1003. Universal Travel Sites (35)

    本题是PAT上顶级一道题目,考察的知识点其实只有一个,最大流问题.用基于广度优先搜索的Edmonds-Karp算法求解.题目意思就是说求解最多能从地球站发送出去的最大人数,在到达目的星球(MAR)上途 ...

  4. 1003. Universal Travel Sites (35)解题报告

    思路 这道题实际上是在问图算法中的最大流问题,使用Edmonds-Karp算法就可以解决. 它的时间复杂度是O(VE^2).具体的算法和证明请参考<算法导论>第六部分图算法第26章最大流. ...

  5. PAT-Top-1003 Universal Travel Sites (35分)网络流最大流

    1003 Universal Travel Sites (35分) 题目传送门:1003 Universal Travel Sites (35分) 一.题目大意 二.解题思路 网络流问题,第一次尝试, ...

  6. PAT顶级 1016 Uniqueness of MST (35分)(判断最小生成树是否唯一)

    添加链接描述 Given any weighted undirected graph, there exists at least one minimum spanning tree (MST) if ...

  7. pat顶级1022 Werewolf (35 point(s))

    欢迎访问我的pat顶级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/86751676 题目描述 算法设计 这道题是pat甲级1148 ...

  8. pat顶级1004 To Buy or Not to Buy - Hard Version (35 point(s))

    欢迎访问我的pat顶级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/86751676 题目描述 算法设计 这道题没什么好办法,只能进行 ...

  9. PAT学习资料汇总(PAT甲级、PAT顶级、PAT考试经验)

    二.PAT甲级 PAT甲级真题目录(按题型整理) PAT甲级真题目录(按题型整理)_love music.的博客-CSDN博客_pat甲级真题 PAT甲[所有题目+解析+代码示例+总结]附带所有历年整 ...

最新文章

  1. 周志华:“数据、算法、算力”人工智能三要素,在未来要加上“知识”| CCF-GAIR 2020...
  2. 在text html模版中写js,如何利用模板将HTML从JavaScript中抽离
  3. ip sensor芯片级解决方案
  4. python科学计算笔记(三)pandas中Series和DataFrame练习
  5. 电子数字 网易游戏在线笔试 第一题 hihocoder
  6. 网管日志-06.08.16
  7. 连续时间系统的s域分析(Matlab)
  8. java 多线程(生产者消费者)
  9. readResolve()原理
  10. 华佳慧科技:OSN500设备ERPS相切环组网介绍
  11. java char表示范围_char取值范围
  12. 浏览器点击链接总是跳转到百度首页界面
  13. Sort of sort
  14. setup factory打包工具的使用
  15. C#基于 iTextSharp.text.pdf 实现PDF水印添加功能
  16. android 设置布局宽度,Android布局宽度为50%
  17. Spring定时任务注解说明
  18. Linux.配置Hadoop环境的一些问题解决
  19. 【学习笔记】斯坦福SCI写作课 Unit 1
  20. 联想卡在logo界面_联想电脑卡在logo界面 联想电脑卡在载入界面怎么办

热门文章

  1. 逻辑学和计算机科学,数学、逻辑与计算机科学的关系
  2. 量子力学多世界解释:这个世界的你是穷光蛋 另一个世界是亿万富翁(文中有赠书活动)...
  3. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理
  4. /Users/ng/Library/Developer/CoreSimulator/Devices/9B82D44F-703C-481E-BA28-71892DEA823D/data/Containe
  5. DG部署(主库rac)--rman 异机恢复方式
  6. [Layui]主页tab选项卡操作(刷新页面,刷新选项卡,关闭,关闭其他,全部关闭)
  7. python可视化水平双向箭头_科学网—Python matplotlib quiver—画箭头、风场、量场图 - 张伟的博文...
  8. 编程已正式列入高考!孩子的未来, 不仅仅与语数英有关!
  9. Spring构造器的三种注入方式
  10. 芝加哥大学计算机语言学,芝加哥大学cs专业值得申请么?