摘要: /**State: POJ3177 Accepted 340K 16MS C++ 1877B*题目大意:* 给出一个无向连通图,判断最少需要加多少条边,才能使得* 任意两点之间至少有两条相互"边独立"的道路.注意,可能* 含有重边.*解题思路:* 先缩点,之后形成一棵树,然后求(叶子节点数量+1)/ 2即可。*/View Code 1 #include <iostream> 2 #include <vector> 3 #include <stack> 4 using namespace std; ... 阅读全文
posted @ 2012-08-16 08:40 cchun 阅读(791) 评论(0) 推荐(0) 编辑
摘要: /**State: POJ3160 Accepted 1812K 63MS C++ 3743B *题目大意:* 一个圣诞老人去给n个同学送东西,然后每个同学会给圣诞老人评价(可正负),* 然后n个同学的地址是一个有向有环图,每到一个同学家门口,圣诞老人可以* 选择进去,或者不进去,圣诞老人走到无路可走为止,然后要求给圣诞老人选* 一个起点,使得圣诞老人这次旅行获得的权值最大。*解题思路:* 题意看了好久啊,有向有环图,还可以选择拿权值或者不拿,最终要求总共最* 大权值,那么可以一开... 阅读全文
posted @ 2012-08-16 08:38 cchun 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 一开始想傻了,其实缩点之后,就很简单了。/**State: HDU3072 328MS 2648K 2039 B C++ *题目大意:* 有一个含边权有向图,然后有向图中的强连通分量里面通信不需要* 权值,要求从0点开始向所有的点通信,然后求最后总权值最小。*解题思路:* 看到强连通分量不需要权值即可通信,就想到缩点。缩点之后就是一个* DAG,然后这个DAG里面的除了起始点0之外,所有点都要走一次,那么* 想清楚了其实就是每一个点有多条入度边,只需要找其中权值最小的* 一条入度边即可,然后实现这个过程可以在缩点... 阅读全文
posted @ 2012-08-16 08:37 cchun 阅读(145) 评论(0) 推荐(0) 编辑
摘要: //缩点+spfa/**State: POJ3114 Accepted 2908K 375MS C++ 2953B*题目大意:* 给定一个有向有权图,然后要求求出图中任意两点间的最短距离。* 注意图中可能有环,每一个环中的任意两点间的距离为0.*解题思路:* 题意看了好久,一开始还以为是lca,后来才发现那个奇怪的特征,* 原来每个环中的任意两点间的距离为0,就说明要进行缩点了。缩点* 之后还是要求最短距离,这个时候就想到了spfa.* 总结就是: 缩点 + spfa*解题感想:... 阅读全文
posted @ 2012-08-16 08:36 cchun 阅读(510) 评论(0) 推荐(0) 编辑
摘要: /**题目大意:* 在数学里面有两种关系,一种是充分条件,即对于集合p,q,p => q,* 另一种是等价关系,p => q && q =>p, 这两种关系都具有传递性,p* => q 可以对应到有节点p到节点q有一条边。问:给定一些集合的充分* 性关系,确定出若让所有集合都等价,还需在添加最少的充分性条件。*解题思路:* 有向图加最少边变强连通,模板题*/View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using.. 阅读全文
posted @ 2012-08-16 08:34 cchun 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 缩点+加最少边 变强连通/**State: POJ2375 26396K 938MS C++ 2743B 险过:limit:1000ms*题目大意:* FR为自己的牛建立了一个H*W的矩形溜冰场,每一个小方格都* 有一个高度L,牛只能向相邻的小方格滑动(即上下左右),* 而且相邻的小方格的高度不能比当前高度高。为了使牛能够从* 任意一点到达任意其他的点。FR打算买一些ski lifts。它能够* 连接两个小方格,使得这两个小方格能够相互到达(与高度无* 关)。问至少需要多少ski lifts。... 阅读全文
posted @ 2012-08-16 08:33 cchun 阅读(471) 评论(0) 推荐(0) 编辑
摘要: /**State: POJ1144 224K 94MS C++ 1735B*题目大意:* 求无向图的割点。*解题思路:* 就输入比较奇葩,要处理下字符串而已。注意判断一个点是割点,要具备两个* 条件,一个是dfs树的根节点(比较特殊,注意减1,按tarjan去理解即可)* ,一个是dfs中的子节点。*/View Code 1 #include <iostream> 2 #include <vector> 3 #include <cstdio> 4 #include <cstring> 5 #include <stri... 阅读全文
posted @ 2012-08-16 01:42 cchun 阅读(192) 评论(0) 推荐(0) 编辑
摘要: //可作为模板,静态邻接表//HDU1827/**State: HDU1827 125MS 336K 2082 B C++ *题目大意:* wiskey大牛要通过电话通知大家,如果你有别的队员的电话,就可以有你代劳* 通知这些人,通知每个人的话费是不一样的,wiskey要花费最少达到通知所有* 人的目的。打电话这种模型具有传递性,用<A, B>来表示A可以通知到B,即如果* <A, B>,且<B, C>,则<A, C>。*解题思路:* 强连通分量缩点,之后求入度为0的点的个数即为最小通知人数,求缩点后,每个* ... 阅读全文
posted @ 2012-08-16 01:40 cchun 阅读(302) 评论(0) 推荐(0) 编辑
摘要: /**State: POJ1236 164K 32MS C++ 2735B*题目大意:* 给定一个n (n<=100)个点的有向图,问:* Q1、最少需要选择多少个点,使得从这些点出发能遍历完整个图;* Q2、最少需要添加多少条有向边,使得整个图成为连通图;*解题思路:* 用tarjan_scc缩点之后求入度为0的节点个数即可Q1,之后再算加最少的* 边使图构成强连通分量即可。算出度为0跟入度为0的数量的最大值。不管* 缩点后的图是否有连通分支。*注意:* 求加最少边变成强连通,只需算出... 阅读全文
posted @ 2012-08-16 01:39 cchun 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 这道题目挺有意思,amb大牛还发了那个强大的仙人掌图剖析的pdf,自己yy了一种解法,由于HDU上的数据够弱,暂时没有发现自己的代码有啥错误的。网上各种代码错误,还各种ac了~~这道题的数据,汗~~可以测测这一组数据:140 11 22 02 33 23 00 0正确输出:no/**State: HDU3594 78MS 2644K 3134 B C++ *题目大意:* 给一个有向图,判断这个有向图是否为仙人掌图。* 仙人掌图满足:1、是强连通图 2、每条边都只属于一个环*解题思路:* 判断强连通比较好做,主要是要判断每条边都属于一个环。* ... 阅读全文
posted @ 2012-08-16 01:37 cchun 阅读(491) 评论(0) 推荐(0) 编辑
摘要: 并查集运用,最后那一步并查集判断个人觉得有点儿小微妙。/**State: HDU3560 234MS 1812K 1260 B C++ *题目大意:* 给定一个无向图,求无向图的连通分量的数量,还有连通分量是一个环的* 数量。*解题思路:* 各种解法都行,用并查集比较简单。还可以用广搜,还可以用深搜,但是写起来麻烦。* 而且广搜跟深搜的时间复杂度是O(v + e),但是并查集的时间复杂度通过有效地修改* 可以改至接近线性,采用启发式合并还有路径压缩,还可以到达O(1),优雅至极。*题目困惑:* 用并查集开始写,... 阅读全文
posted @ 2012-08-16 01:32 cchun 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 对于我来说真是一道好题,一开始纠结为缩点跟求块,最后还是一个8字形的图no了我一下。/**State: HDU3394 328MS 2052K 1918 B C++ 题意描述:* 公园有n个景点,公园的管理员计划要建m条道路,并且安排一* 些形成回路的参观路径,如果一条道路可以被多条回路共用,* 那么这条边是冲突边,如果不能形成环的路则为不需要的边,* 现在就是求无向图中冲突边和不需要边的条数*解题思路:* 把图分为多个块,然后判断每个块里面的边数,如果块的边数* 等于块的点数,那么该块只有一个环,如果块的边数... 阅读全文
posted @ 2012-08-16 01:30 cchun 阅读(422) 评论(1) 推荐(0) 编辑
摘要: 第一次试手,就知道求割边,结果各种TLE,还改了向量为邻接表。其实问题是没有想到缩点之后是一棵树,之后每条树边都是割边,一遍dfs./**State: HDU2242 281MS 1604K 2899 B*题目大意:* 给一个有重边的无向图,然后要求判断能否删除一条边使图分为* 两个部分。图中每个点都有权重,如果可以分成两个部分,求这* 两个部分差值的最小值。*解题思路:* 先用tarjan缩点,把强连通分量都缩成点,因为强连通分量是不能* 删除一条边使图分开的。缩点之后就是一棵树,之后在这棵树上进行* 记忆化... 阅读全文
posted @ 2012-08-16 01:23 cchun 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 这道题目主要是构图,之后就是水水地求连通分量个数了,用广搜,用深搜,用并查集都行,不过并查集效率要高。/**State: HDU1198 46MS 372K 2322 B C++ *题目大意:* 给定A~K个固定的小方块,方块中有水管,然后要求凑这些小方块成为* 一个大矩形,求最后形成的连通分量数目。*解题思路:* 主要是构图比较特别。枚举每个小方块构图,最后用dfs查连通分量数即可。* 图可构为无向图。*解题感想:* 好像用map慢了许多。第三次优化用了并查集,果然0ms了,连建图都省了*/并查集版本:View Code ... 阅读全文
posted @ 2012-08-16 01:20 cchun 阅读(225) 评论(0) 推荐(0) 编辑
摘要: /**State: HDU3861 46MS 1468K 3001 B C++ *题目大意:* 给定一个含有n个点的有向图,然后要求把这个有向图分为多个图,* 要求如果图中有两个点能够互相到达的,必须把它们分为同一个图。* 然后要求分割出来的图中,任意两个点之间一定可以互达。*解题思路:* 题目要求如果图中两个点可以互达,要分为同一个图,那么可以先* 求出强连通分量,然后缩点。之后就是一个ADG,用笔画了很久,发现* 一个ADG要分为多个分量,然后每个分量重每两个点有路径通过,最* 最小分量,其... 阅读全文
posted @ 2012-08-16 01:16 cchun 阅读(400) 评论(0) 推荐(0) 编辑
摘要: /**State: HDU1269 46MS 1428K 1364 B*题目大意:* 给一个n个点,m条边的有向图,判断该图是否为强连通图*解题思路:* 用tarjan,但是要注意该图可能有连通分量。*/View Code 1 #include <iostream> 2 #include <vector> 3 #include <stdio.h> 4 #include <stack> 5 using namespace std; 6 7 const int MAX = 10005; 8 vector<int> vec[MAX]; 9 阅读全文
posted @ 2012-08-16 01:14 cchun 阅读(194) 评论(0) 推荐(0) 编辑