
第十一章 - 图论模型与算法
文章平均质量分 79
专攻挖掘机炒鸡蛋算法
Hahahahaha!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UVa #247 Calling Circles (例题11-4)
图的连通性问题。两个人相互连通当且仅当两人互相直接或者间接打过电话。因为间接通话的存在,无法直接用dfs来求连通块。要用Floyd算法实现的传递闭包来预处理两人是否直接或间接的通过话。Floyd算法完后则可以用dfs求出所有连通块了。Run Time: 0.059s#define UVa "LT11-4.247.cpp" //Calling Circleschar原创 2015-03-26 13:38:16 · 716 阅读 · 0 评论 -
UVa #12661 Funny Car Racing (例题11-11)
带权最短路。但松弛操作需要分类讨论,要考虑清楚。Bellman-Ford和Dijkstra速度差不多。Run Time: 0.139s#define UVa "LT11-11.12661.cpp" //Funny Car Racingchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#i原创 2015-03-30 16:18:23 · 990 阅读 · 0 评论 -
UVa #1349 Optimal Bus Route Design (例题11-10)
这道题作为一道regional,最值得学习的应该是问题的等价转换。把“找出几个圈,使得所有的点都只存在于一个圈内”,转换为“给每个点找一个孩子,使得一个点只有一个父亲”。转换后的问题,就可以用二分图匹配来做了:每个点拆成两部分分别放在二分图的S和T,使得S到T的连线代表儿子-父亲的关系。之后再求二分图的带权值的完美匹配,则可以保证每个结点只有一个儿子、一个父亲的情况下,求出最小费用了。原创 2015-03-29 23:21:50 · 881 阅读 · 0 评论 -
UVa #1658 Admiral (例题11-9)
每个点只能访问一次,可以将每个点拆成两个点,中间连一条费用为0、容量为1的边。这样求最小费用最大流时就保证了每个点只访问一次。因为是两艘船走,所以限制流量为2,求出最小费用即可。注意点数会翻倍,数组也要多开一倍大。Run Time: 0.046s#define UVa "LT11-9.1658.cpp" //Admiral#include#in原创 2015-03-28 15:15:40 · 646 阅读 · 0 评论 -
UVa #753 A Plug for UNIX (例题11-7)
网络最大流问题。建图的时候,取一个起点s,与所有设备的接口连接;再取一个终点t,与所有插线板的接口连接,流量都设为1。注意这里可能在相同的点之间多次添加边(比如不同的设备有着相同的接口),不过不影响解,只不过可能会增加增广的次数,对效率有所影响。之后在转换器可以转换的接口之间连线,流量无限大。这样,求s到t之间的最大流,再用设备数量减去最大流的数量就是答案了。原创 2015-03-27 11:38:06 · 799 阅读 · 0 评论 -
UVa #11082 Matrix Decompressing (例题11-8)
Run Time: 0.029s#define UVa "LT11-8.11082.cpp" //Matrix Decompressingchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#include#include#includeusing namespace std;原创 2015-03-27 16:04:12 · 754 阅读 · 0 评论 -
UVa #658 It's not a Bug, it's a Feature! (例题11-6)
和第七章的题目很像,dijkstra求隐式图最短路。Run Time: 2.202s#define UVa "LT11-6.658.cpp" //It's not a Bug, it's a Feature!char fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#inclu原创 2015-03-26 13:57:25 · 668 阅读 · 0 评论 -
UVa #1151 Buy or Build (例题11-3)
套餐只有8个,可以暴力枚举。不过边太多,不能枚举套餐都求一遍最小生成树。其实只需要在一开始求出不包含套餐的最小生成树,把这些边记下来备用。之后枚举套餐的时候,先把套餐中的点全部加入并查集,然后在原最小生成树的基础上,再来求最小生成树就可以了。那些一开始就没有被加入最小生成树的边,到了暴力枚举又加入很多权值为0的边排在他们前面,就更加不会被包含到最小生成树中了。原创 2015-03-26 11:51:46 · 934 阅读 · 0 评论 -
UVa #1395 Slim Span (例题11-2)
这道题的目标是最大权值和最小权值的差最小,和最小生成树不太一样。我们可以暴力枚举最小权值(放弃权值更小的边),然后求最小生成树。因为Kruscal算法按照权值顺序考虑各条边,所以一旦所有点连通,则可以计算出最大权值和最小权值的差并记录,然后continue。Run Time: 0.079s#define UVa "LT11-2.1395.cpp" //Slim Sp原创 2015-03-26 11:41:25 · 762 阅读 · 0 评论 -
UVa #12219 Common Subexpression Elimination (例题11-1)
这题和普通的表达式树很像,但如果按照一般的做法(用L、R代表范围),会TLE,因为重复了太多无用的扫描这题树中的结点对应的子树都是二叉树,不存在只有一个儿子的情况。输入的字符串中也只有两种情况,结点名字后面紧跟一个左括号的,和不跟括号的。因此很容易判断一个结点是否为叶子结点:只要在原字符串中看他后面有没有紧跟着左括号就行了。如果有,立刻递归建树作为左子树。因为有左子树就一定有右子树原创 2015-03-26 11:06:17 · 1712 阅读 · 0 评论 -
UVa #10048 Audiophobia (例题11-5)
因为会输入多组查询,因此用Floyd算法进行预处理效率会比每次重新算的效率要高一些。因为题目要求的是一条最大权值最小的路,因此Floyd算法中的松弛操作的右边应该从加法变为max()。Run Time: 0.022s#define UVa "LT11-5.10048.cpp" //Audiophobiachar fileIn[30] = UVa, fileOut[原创 2015-03-26 13:48:54 · 648 阅读 · 0 评论 -
UVa #821 Page Hopping , UVa #820 Internet Bandwidth (习题11-1,11-3)
一个Floyd最短路,一个EdmondsKarp最大流Run Time: 0.128s#define UVa "11-1.821.cpp" //Page Hoppingchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#includeusing namespace原创 2015-04-16 18:09:28 · 993 阅读 · 0 评论