比赛链接在这里:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25597#overview
以下是26道题的简要题解:
如果是我自己已经AC的题目,我全部补了自己的详细题解及代码,虽然赶时间写的很草,对不起大家。。。
对于我还没AC的题目,我附了其他人的解题报告。
1、Problem A HDU 1180 诡异的楼梯
BFS的变形。
按时间的奇偶性拆点。
解题报告见http://blog.csdn.net/frog1902/article/details/9257989
2、Problem B: HDU 4081 Qin Shi Huang's National Road System
首先,一定是在最小生成树上去掉一条边,然后在被分成的两部分间加上一条边。
因为把最小生成树去掉一条边的话,残留在两部分的生成树就是它们各自的最小生成树,否则把这条边加回来完全可以构成一个更优的最小生成树,矛盾。解题报告见:http://blog.csdn.net/frog1902/article/details/12350021
3、Problem C: POJ 3662 Telephone Lines
二分求值+dijkstra判定。
解题报告见http://blog.csdn.net/frog1902/article/details/9526695
4、Problem D: POJ 1062 昂贵的聘礼
最短路。值得一做的原因是需要从题面中提取出隐含的限制,
即最短路中的点的序号,一定位于一个长度为m的区间中
解题报告见:http://blog.csdn.net/frog1902/article/details/952691
5、Problem E: POJ 3463 Sightseeing
方法一是在dijkstra的过程中为每个点保留三个值:最短路的长度,最短路的数量,次短路的数量。
然后在最短路的长度变化的时候处理转移就可以了,比较繁琐。
方法二是预处理出起点和终点到每个点的距离,顺便处理出最短路的数量。
然后枚举不在最短路上的边,看有多少条边可以达到次短路。
解题报告见:http://blog.csdn.net/frog1902/article/details/9256391
6、Problem F: SCU 4243 Saving Girl
预处理出走到每个格子所获得的伤害值总和,然后做SPFA。
解题报告见http://blog.csdn.net/frog1902/article/details/8274871
7、Problem G: POJ 3613 Cow Relays
方法一是因为最终肯定是有一条路被反复走了很多次,所以先做最短路再找出一条边反复走。
方法二类似floyd,借助矩阵快速幂来优化,解题报告见:http://blog.csdn.net/qq7366020/article/details/8893210
关于矩阵优化可以参考俞华程的论文《矩阵乘法在信息学中的应用》
8、Problem H: SCU 1697 Cashier Employment
典型的差分约束题,需要注意的是隐含条件非常非常非常多。
解题报告直接看冯威的《数与图的完美结合——浅析差分约束系统》。
9、Problem I: POJ 1201 Intervals
查分约束,直接把每个点转化为它的前缀和,
如果某个线段[a,b]覆盖了c个点的话,那么就建一条从b到a+1的边,权值为c。
当然隐含条件是任何一个区间包含的点数不可能大于区间长度+1,当然包含的点数也不会是负数。
解题报告见:http://blog.csdn.net/frog1902/article/details/9527375
10、Problem J: URAL 1004 Sightseeing Trip
求无向图最小环,是floyd的一种经典应用。
因为是无向图,要注意两点环的问题,有向图则没有这个问题
解题报告见:http://blog.csdn.net/frog1902/article/details/9527637
11、Problem K: SCU 2751 Wormholes
将道路花费的时间看作“正时间”,边权为正。
将“虫洞”花费的时间看作“负时间”,边权为负。
然后用SPFA寻找负环。
需要注意的是,此题POJ上数据较弱,没有考虑图不连通的情况,请去SOJ测试。
其实考虑图不联通的情况也很简单,建一个虚拟起点,向每个点连一条边权为0的边,
当然在每个联通块做一次SPFA也是一样的,复杂度不变。
解题报告见:http://blog.csdn.net/frog1902/article/details/9531981
12、Problem L: POJ 2449 Remmarguts' Date
K短路模板题,
预处理终点到各点的最短距离,作为启发函数。
然后用Astar算法搜索出的第K个点的路径长度就是第K短路,
解题报告见:http://blog.csdn.net/frog1902/article/details/9248089
13、Problem M :SCU 4110 PE class
拓扑排序。
注意要求的不是拓扑序列字典序最小,而是1~N号球所对应的排序后的位置构成的序列字典序最小,
因此要倒序拓扑,每次让序号大的球尽量往后排。
这道题应该是改编自 POJ3687
解题报告见:http://blog.csdn.net/frog1902/article/details/9532129
14、Problem N:POJ 3694 Network
首先把所有的双联通分支缩成一个点,形成一棵树。
然后每连接两个点,就朴素寻找它们的LCA。
沿途求出有多少桥边变成了普通边,并且把新形成的这个环上的点缩成一个点。
解题报告见:http://blog.csdn.net/sdj222555/article/details/7211644
15、Problem O: SCU 1187 Closest Common Ancestors
LCA模板题
go[i][j]数组表示由i点向上跳j层到达的根节点。
预处理go数组,可以dfs的时候由根节点向子节点传递一下。
求解LCA时,先让两个点位于同一层上,
然后再二分地让他们跳到LCA下面一层的位置,就可以求出LCA。
解题报告见:http://blog.csdn.net/frog1902/article/details/9532233
16、Problem P:UESTC 1717 Journey
LCA的变形
解题报告见:http://hi.baidu.com/aigoruan/item/a6af372ec9c772da0e37f9a4
17、Problem Q:HDU 4408 Minimum Spanning Tree
这题数据非常水,可以直接暴力。
A了这道之后建议做SPOJ的MSTS
所有最小生成树的权值为ci的边的数量ni和所连接的点集S是一样。
由此可以计算每种权值的边拿出ni个构成S的最小生成树的数量。
那么我们把权值相同的边看成一组,我们先从小到大的求每个组的联通块中生成树的数量。
然后把每个组内的边进行krustal合并,形成一个新图。
我们再对这个图进行生成树计数,最后全部相乘。
解题报告见:http://blog.csdn.net/frog1902/article/details/9532315
18、POJ 1679: The Unique MST
次小生成树模板题。
方法一是prim的变形:
首先求出最小生成树,
然后枚举剩下的边逐个加入,
加入后会在树上形成一个环。
我们在这个环上找一条次大边(可以在prim的过程中O(n^2)求出)去掉之后就留下一棵生成树。
所有这些生成树中最大的那个就是次小生成树。
知道了次小生成树的权值和,想判断MST唯不唯一也就毫不困难了。
方法二是krustal的变形:
用Kruskal求出最小生成树,枚举树上的长度出现次数大于1的边,删除,求最小生成树。取最小值即为次小生成树。
解题报告见:http://hi.baidu.com/buaa_babt/item/257317c031488b47bcef692d (这可是一对北航的ACMer情侣一起写的百度空间哦 >o<)
19、Problem S:POJ 2728 Desert King
最优比率生成树,
借助0-1分数规划求解,可以看胡伯涛的《最小割模型在信息学竞赛中的应用》
虽然最优比率生成树也可以用迭代的方法做,但总觉得二分才是它的精髓。。。
解题报告见:http://www.abandonzhang.com/archives/730
20、Problem T:POJ 1639 Picnic Planning
K度限制生成树模板题。
K度限制生成树除了传统的迭代算法以外。
watashi当年在CF上曾经用二分的方法解K度限制生成树。
大意是给每条与根相连的边额外赋权,
通过这个额外的权值来控制MST中与根相连的边的数量,
然后二分这个权值。
虽然我用这种方法做这题怎么都过不了,但我觉得这个算法的思想还是非常值得借鉴的,尤其是在网络图的建图中。
解题报告见:http://www.cnblogs.com/Missa/archive/2013/04/07/3005880.html
21、Problem U:POJ 2942 Knights of the Round Table
首先,如果两个骑士可以相邻坐,就在它们之间连一条无向边。
然后求双联通分量。
如果一个双联通分量中含有一个奇环,那么这个双联通的所有点都位于奇数环中。
所以只要判断每个双联通分量是否含有奇环就可以了。
判定二分图时,使用的是黑白染色法。
而一个图含有奇环的充要条件是它不是一个二分图。
所以我们可以用判定二分图的方法判定奇圈。
当然,不含奇圈的联通块和单点的联通块就是必须驱逐的骑士了。
解题报告见:http://blog.csdn.net/frog1902/article/details/9533441
22、Problem V: POJ 2186 Popular Cows
求强联通。
缩点之后形成了一个DAG。
如果没有出度为0的块,
必然无解。
因为某个块有指向另一个块的边的话,那么那个块肯定就没有指向它的边或有向路径了,因为那样就形成了环。
如果出度为0的块多于一个,也无解。
因为显然从一个出度为零的块无法到达另一个出度为零的块。
如果有且只有一个出度为0的块,
这个块中的点即为解。
解题报告见:http://blog.csdn.net/frog1902/article/details/9533917
23、Problem W: POJ 3352 Road Construction
双联通模板题。
比较特殊的是有重边。
那么在访问每条边的时候看一下它的反向边是否被访问即可。
求完双联通并缩点之后,统计出树中度为1的节点的个数,即为叶节点的个数。
每次在两个相隔最远的点直接连一条边即可。
解题报告见:http://blog.csdn.net/frog1902/article/details/9534009
24、Problem X: ZOJ 3717 Balloon
二分求值+2-SAT判定。
o(n^2)预处理出距离。
每次判定,若两气球在当前半径值下会重叠,则本轮不能同时选择。
解题报告见:http://blog.csdn.net/frog1902/article/details/9207533
25、Problem Y: SGU 307 Cipher
整个网格的状态是由第一行和第一列决定的。
我们不妨枚举(0,0)的状态,
然后再根据给出的和对于所有其它第一行和第一列的格子做限制。
然后通过2-SAT得出第一行和第一列的合法状态。
最后简单递推即可。
解题报告见:http://blog.csdn.net/frog1902/article/details/9534107
26、Problem Z:HDU 3760 Ideal Path
预处理出起点和终点到每个点的最短距离。
如果某点到起点和终点的距离和等于最短路的长度,那么它就有可能是最短路上的点。
这样就方便的把图划分了层次,
在这个层次图上,实质上边权就等同于点权。
在同一层的点中找一个字典序最小的即可。
解题报告见:http://blog.csdn.net/frog1902/article/details/9534201