Ryen的学习笔记

成长有多少新奇的美,就有多少撕裂的痛;离去有多么辽阔的自由,就有多么无边的孤寂。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

算法练习五(图论部分)

Posted on 2010-03-07 18:18  Ryen_lee  阅读(507)  评论(0)    收藏  举报
  • The Suspects(1611,): 考察并查集的基本使用,路径压缩可以有效提升效率。结果要统计含有‘0’元素的集合内元素的个数。
  • Ubiquitous Religions(2524,):一样考察并查集基本使用,结果需要统计所有的集合的个数。
  • Risk(1603,):任意点最短路径,直接只用floyd即可,注意memset(d, 1, sizeof(d));的效果(此时有const int INF = 16843009;)。
  • Freckles(2560,):最小生成树,使用Kruskal算法,并查集使用路径压缩可以0MS。该题中用qsort对边的长度通过编号进行间接排序,应该是w[a] > w[b] ? 1 : -1(若是0,排序就会诡异的出错)。
  • Audiophobia(,10048):任意点最短路径的变种,使用floyd算法即可。
  • Connect the Campus(,10397): MST的小变形,将图中已经存在的边权重设为0,然后使用kruskal算法即可。这次由于有多个测试样例,忘了对全局量进行重置,使得WA一次。
  • Arctic Network(2349,):乍一看是上一题的加强版,这次仍然是有边权重为0,但是哪些边位0不知道,只知道权重可以为0的边的数目,但是再想一下,仍然是MST,利用MST的思想应该可以证明。
  • It's not a Bug, It's a Feature!(1482,): 隐式图搜索,使用BFS, 也可以看成是使用基于优先队列的Dijkstra算法,使用位数组 1700MS AC, 分析发现状态可由一个int表示,则使用位运算可以降低到170MS。注: 判断 v 中 含有和 u中一样个数和位置的1 使用  (~v & u == 0).
  • The Tourist Guide(,10099): 意思和RISK很想,仍然是最短路径变形题,使用Dijkstra算法AC通过,该题有个小陷阱,即导游本人也会占一个容量。O
  • Lift Hopping(,10801):将每层分成电梯个状态,硬使用Dijstra算法,由于每层进行了状态扩充,所以起点和终点也变成了多个,因此算法要进行多次。感觉状态应该能简化下。
  • Sending email(,10986): 基础的Dijstra,由于节点输入规模太大,且是稀疏图,使用邻接链表+heap的版本,需要注意的是题目中的一条边是两条,在构造链表时要注意下。
  • Wormholes(,558): Bellman-ford的模版题,题目要求判断负环是否存在,因此没有使用队列版本。
  • King(1364,515): 题目有点晦涩,其实就是判断一个差分约束系统是否存在。而其有等价于检测一个图是否存在负环。将输入转换为图使用Bellman-ford通过。
  • Arbitrage(1238,):经典的套利问题,与POJ另一道同名题不同需要输出最小套利环,难度加大。该题已经不是一般的负环问题(阈值是1.01而不是1.01)。由于要输出最小环,因此Floyd算法失效。使用O(n^4)的原始算法,思路可以看成是Bell-man算法的全点对版, 思路是步步考虑,每次增加一步,(该题也可以用矩阵连乘实现),这样就保证了环最小性。 因为需要每步松弛后的结果进行检查环是否存在,使用三维数组(不再使用滚动数组)。
  • Numbering Paths(,125): 使用Floyd算法即可,此题说明Floyd算法可以以O(n^3)的效率判断所有点对的路径中间是否存在负环(但不能输出最小的)。
  • Thunder Mountain(,10803): 直接使用Floyd算法,在判断边长的使用使用整数,避免精度问题。 还要注意题意,如果有一条边不可达就得输出否。
  • Power Transmission(,10330): 最大流,不过节点也有了容量限制,开始直接使用算法,加上个节点限制通过了所遇测试,仍然WA, 不得已分拆节点AC, 看来最大流算法真是经典的得不容修改了。
  • Dijkstra, Dijkstra.(,10806): 最小费用最大流, 更新时注意讲反向边的费用反号即可。
  • Street Numbers(,138): 没有输入,一个可以预计算的题目,PELL方程的应用,但通过一个加速的暴力算法也能在较短时间内出结果。