图论

来源:互联网 发布:淘宝直通车如何关闭 编辑:程序博客网 时间:2024/05/22 02:01

1. POJ 3692 Kindergarten
题意:现在又一群男生和一群女生,男生男生之间互相认识,女生女生间互相认识,有的男生认识有的女生(不可以传递,也就是说不可以男1号认识女一号,就表示男二号也认识女一号的),现在老师要选择一个集合,这个集合里面的学生都互相认识,输出集合的最多人数。

思路:开始看到集合里面最多的人数,并且这个集合里面的人还要都互相认识,首先想到了强连通,但是发现了强连通之间的关系可以传递,而这边是不可以传递的,所以不能用强连通做。这种题型强连通不行,估计只能用二分图了,然后思考后发现是一个二分图的最大独立集,按照男生和女生不认识的关系建立边(注意是不认识,题目给出的是认识),然后求解建立出图形的最小点集覆盖,而最大独立及就是最小点集覆盖的补集。
PS:复习下二分图的一些关系
最小点集覆盖=最大匹配 因为如果还存在一条边没有覆盖到的话必然又会多一个匹配边
最大独立集=N-最大匹配 最大独立集其实就是最小点集覆盖的补集,因为最小点集覆盖将所有有关系的边都覆盖进来了,如果去除一些点就能保证其余点都没有关系了,但是去除多少点呢?去除的点的数目就是最大匹配的数目

2. POJ 3660 Cow Contest
题意:现在给你一个有向图,每一个点代表一个奶牛,如果A,B代表奶牛A能战胜奶牛B,现在要你求出奶牛的排名,但是有的奶牛之间并没有确切的关系,所以这些奶牛的名次无法确定,现在要求你求出能确定排名的奶牛有多少个

思路:看到题目发现图的模型就像拓扑排序一样,但是拓扑排序并不能找出确定的点,然后又想想能不能将所有的排序方法枚举出来,因为那么多点是不变的,所以排序出来的长度一样,我们只要找到哪一个编号在那么多排序中位置一直没有变化就行了。可是好难实现,无疾而终。网上搜了一下,发现是弗洛伊德解决传递闭包,跑到维基上搜了下,弗洛伊德算法不仅能解决每对顶点之间的最短路径还能解决闭包问题。这样我们就可以用floyd来解决,如果从A能到B就代表A的排名一定在B的前面,按照这种原理,我们能找出每一个点肯定有一些前驱结点和后继结点(前驱代表排名在它前面的,后继代表排名在它后面的),如果该点的前驱加后继等于N-1,那么这个点排名就是确定的。真神奇,看来还是得多学学,比我原来想的那个方法好了不知多少倍,呵呵~~

3. POJ 3522 Slim Span
题意:现在有一个无向图,让你求解一个树能包含所有的顶点,但是要求是连接这个数的所有边的最大值和最小值的差最小。

思路:因为求解的是树里面最大值最小值的差最小,习惯了用Prim算法的我就在想,如果枚举出所有的生成树,记录每个树的差值,取最小的就行,可惜用Prim来枚举出所有的树貌似不是个轻松地活儿,不仅费时而且费力,然后和叶浩讨论了下,因为需要用到最大值减去最小值,那么不是有个现成的Kruscal算法先将所有的边排一下序,这样不就省事儿了嘛,我们只要按照Kruscal算法来求解生成树就行了,第一个是最小生成树,求到后保存差值,然后下一次从第二条边开始用Kruscal算法求解生成树再保存,再求差值,一直往后面求解,这样就能求解到最终结果了。(PS:第二次求解就相当于去除前面最小的一条边了,为什么要去除前面最小的一条边呢?如果不去最小,必然导致下一次求解的生成树差值比这一次大,所以我们只能去它,看能不能找到新边来让差值变小,好玩儿吧~~~)

4. POJ 3615 Cow Hurdles
题意:奶牛们在要跳木桩,但是木桩的高度不一样,他们想要从A跳到B上的话,就会消耗,消耗的能量是这条路径上最大值的那条边,还有图是有向图,然后给你好多组起点终点,问你这些对起点到终点所消耗的能量是多少。

思路:看的出来是个最短路径问题,而且又有很多对,那么就可以用Floyd来解决,就是更新的地方注意一下,不难,点不多,O(n^3)能过。

5. POJ 2060 POJ 3216
这两道题目基本上一样,两个里面就说一个3216吧
题意:现在有Q个修理站,有M个修理任务,M个修理任务出现在Q个修理站上面,每一个修理任务有一个截止时间(如果在这个时间还没有被修理的话,就不能修理了),并且还有一个参数是修理这个任务需要多长时间,同时给出一个Q*Q的矩阵表示从i个修理站到j个修理站需要多长时间。现在最少需要派出多少个修理工能把这些任务都给修理完成。

思路:卡在最小路径覆盖了,以前小聪子说我最小路径覆盖理解的不对,没在意,现在吃到苦果了,刚刚上课的时候推了好长时间

6. POJ 3343 Against Mammoths
题意:现在人类要和外星人打仗,人类有N个星球,外星人有M个星球,人类星球和外星人星球都有初始的飞船,每年能够生产飞船的速率,如果人类飞船要攻打外星人星球,就需要人类星球派出的飞船的数量大于外星星球上的总数量,但是从人类星球飞行到外星星球需要一定的年限,在飞行中,人类飞船数目不能增长,但是要攻打的外星星球上飞船的数量还在增长。一个人类星球只能攻打一个外星星球,一个外星星球只能被一个人类星球攻打,问你需要多少年人类星球能攻打下所有的外星星球。

思路:现在要求最小年限,我们采用二分图的方法来求解最大匹配,当二分图的最大匹配数目等于M的话,就代表能攻打下所有的外星球,可是我们如何求解最低年限呢?我们可以采取使用二分的方法来缩小年限。

7. POJ 1135 Domino Effect
题意:现在有一堆骨牌,有些关键点,每两个关键点之间都有许多骨牌,如果我把一个骨牌按倒,那么和这个骨牌相连的所有骨牌都会倒下,问你最后倒下的骨牌在哪儿,什么时间。

思路:问题要求我们求解最后倒下的骨牌在哪儿,最短路径的思路,使用dijkstra算法求解出从起点到其余所有点倒下的最短时间,但是不一定是关键点的骨牌最后倒,有可能是某两个关键点连接的边上的骨牌最后倒,我们就可以求出每条边上最后倒的骨牌时间,这个时间怎么算自己想想,不太难,最后比较所有边上,点上骨牌倒的时间,算出最大就行了。

8. POJ 1364 King
题意:给你一堆限制,能不能找出满足条件的解
思路:利用差分约束的思想来解决,我差分约束理解的还不是很透彻

9. POJ 1094 Sorting It All Out
题意:给你很多关系,问你这些点之间的顺序能否确定,当然有时候不仅不能还会形成矛盾
思路:利用Floyd解决传递闭包的思想来搞,还要判断有无回路

10. POJ 1125 Stockbroker Grapevine
题意:如何在N个人中尽快的传递消息,找出从哪个人开始传,最后能够最快的传完,如果不能传完输出”disjoint”.
思路:Floyd解决,每一行里面的最大值代表从这个节点传完的最大值,当然如果这个点无法到达所有的点,这个点是不满足条件的,然后找出N个点分别传完时间的最小值就是我们所求值了。也许你不明白为什么每一行里面的最大值就是从该点传完的时间,这个自己思考下吧,有助于理解。

11. POJ 1789 Truck History
题意:历史上,曾用7个小写字母来表示每种truck的型号,每两种型号之间的差距为字母串中不同字母的个数。现在给出n种不同型号的truck,问怎样使1/Σ(to,td)d(to,td)的值最大
思路: 先比较每两个型号之间的不同,然后表示权值,要想让1/Σ(to,td)d(to,td)最大,就让Σ(to,td)d(to,td)尽量的小,所以问题就转化为了最小生成树的问题了。

12. POJ 2075 Tangled in Cables
题意:给你一跟长电缆(可能是别的材质的,呵呵)现在给你几座城市,没两座城市连接起来需要消耗一定的电缆,问你所有的城市连接起来最少需要多少电缆,如果最小消耗的电缆大于给出的电缆长度,那么就输出“Not enough cable”
思路:这题和上面一题一样,求解最小生成树的问题。不过需要处理的是将各个城市标上号,利用STL里面的map去存储,别的也没什么说的了。

13. POJ 2485 Tangled in Cables
题意:给你一个N,代表N个城市,紧接着N*N的矩阵,表示从i->j花费的费用,现在要将所有的N连接起来,并且花费的费用最少,输出最少费用情况下,花费最大的一条边值
思路:求解最小生成树上的一条最大边。

14. POJ 2387 Til the Cows Come Home
题意:给你T条边连接N个城市,N个点代表N个城市,问你从N号城市跑到1号城市最少花费多长时间。
思路:最短路问题,利用Dijkstra算法的时候注意去重边(老是被重边坑)。

15. POJ 2570 Fiber Network
题意:给你一个N,表示有N个点,下面给出一些边i-j abc表示有a,b,c三家公司可以连接i->j(有向图,公司从a~z表示,这就表示最多就26家),现在下面又给出一些边,问你从i->j有多少家公司可以承包(大概就这意思)
思路:Floyd解决传递闭包问题,注意用二进制优化(有一个数字来表示这条边上公司承包情况,很不错的技巧)