【图论基础练习】 SCU 2013 Summer Traing 3 - Graph Theory (1) 解题报告

来源:互联网 发布:单片机与usb连接电路图 编辑:程序博客网 时间:2024/06/05 19:24

比赛链接在这里: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 MSCU 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

原创粉丝点击