连通性专题(桥、割、LCA...)
文章平均质量分 78
流風回雪_YZK
只盼来日登蜀道..
展开
-
hdu 4738 无向图缩点断桥 // 细节坑题
Caocao's Bridges 题意:给个无向图,求出边权最小的桥。 一看,直接缩点,若无桥,输出-1,有桥,遍历下边,更新最小。。分分钟搞定,以为IA的。。一交wa。。。 坑点:1:若原图不连通,则无须派人去!输出0!; 2:若桥的权是0,则还有派一个人把炸弹拿去,输出1! 3:有重边。(按多条边算)。 哎!记住这个教训!以后做题 1原创 2014-08-15 11:14:32 · 1024 阅读 · 0 评论 -
poj 1236+hdu2767 有向图 缩点+看度数(tarjan)
1236题意:一个有向图,1,求至少从几个点出发可以遍历该图,2:,求至少添加多少边,使强连通。而,HDU的只有后面一问。 解;先缩点,第一问只需找所有入度为0的点即可。,第2问,max(入度为0的点,出度为0点)。也写了2个小时。。虽然1A,但是因为细节卡了,不应该。 代码详细说: #include //0ms 1A poj1236 #include #include #inc原创 2014-02-09 14:54:55 · 974 阅读 · 0 评论 -
poj2553 有向图缩点,强连通分量。
//求这样的sink点:它能达到的点,那个点必能达到他,即(G)={v∈V|任意w∈V:(v→w)推出(w→v)} //我法:tarjan缩点后,遍历点,如果该点到达的点不在同一个强连通中,该点排除,而且该点所在的 //的强连通分支所有点都排除(开始因为这个跪WA!慎思!) #include //143MS, #include #include #include #include #inclu原创 2014-02-09 17:07:44 · 969 阅读 · 2 评论 -
hdu 3072 有向图缩点成最小树形图计算最小权
题意,从0点出发,遍历所有点,遍历边时候要付出代价,在一个SCC中的边不要付费。求最小费用。 有向图缩点(无需建立新图,,n《=50000,建则超时),遍历边,若不在一个SCC中,用一个数组更新记录最小到达该连通分量的最小边权即可。。。边聊天,边1A,哈哈。。。 #include #include #include #include #include using namespace std;原创 2014-08-16 18:38:35 · 940 阅读 · 0 评论 -
hdu 3594 Cactus /uva 10510 仙人掌图判定
仙人掌图(有向):同时满足:1强连通;2任何边不在俩个环中。 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点。HDU数据弱,网上很多错误代码和解法也可以过。 个人解法: 我认为: :仙人掌图必然是欧拉图!这样只用“入度=出度”就可以简单地判断强连通(欧拉图显然强连通)了!而且这个必要(不充分)条件还秒杀好多数据(强连通++)。 个人证明原创 2014-05-03 16:44:44 · 1283 阅读 · 0 评论 -
poj3694+hdu2460 求桥+缩点+LCA/tarjan
这个题使我更深理解了TARJAN算法,题意:无向图,每添加一条边后文桥的数量,三种解法:(按时间顺序),1,暴力,每每求桥,听说这样能过,我没过,用的hash判重,这次有俩个参数(n->10w,开不了二维的),怎么判?联系2个参数,我想到了用一个函数,像散列一样,定义关系,我随便写了一个hash[x+y+x/y+y/x+x%y+y%x+x|y],一直WA,虽然未过,但是想到了这个,以后2个参数判重原创 2014-02-08 19:38:41 · 867 阅读 · 0 评论 -
poj1330+hdu2586 LCA离线算法
整整花了一天学习了LCA,tarjan的离线算法,就切了2个题,DFS+并查集,利用深度优先的特点,回溯的时候U和U的子孙的LCA是U,U和U的兄弟结点的子孙们的LCA是U的父亲,结合每次询问, 2586,求无相无环图,俩点距离,转化树(任意取一点为根),双向边保存,链式前向星保存边和权,DfS, 先记录下每次询问,用链式前向星保存,双向保存,第(i+1)/2条边即为第i次询问(一次询问记为双原创 2014-02-07 19:14:39 · 896 阅读 · 0 评论 -
hdu 3639 有向图缩点+建反向图+搜索
题意:给个有向图,每个人可以投票(可以投很多人,一次一票),但是一个人只能支持一人一次,支持可以传递,自己支持自己不算,被投支持最多的人。 开始想到缩点,然后搜索,问题是有一点想错了!以为支持按票数计算,而不是按人数!还各种树形dp/搜索求可以到达边数。。提交WA了。。。 又反复读了题目之后才发现。。错误。。只要人数就行。。。问题简单了许多。。。 缩点成有向无环图后:每个SCC中支持的人数就原创 2014-08-17 16:28:25 · 1072 阅读 · 0 评论 -
hdu 5044 树区间操作最后输出/ lca+dfs
题意:一棵树,俩种操作:1 有路径上的所有点加vi,2所有边加vi。 先离线求出所有询问的lca,再遍历询问一次,点+vi,lca-2*vi ,最后dfs从叶子扫上来一次,最后再祖先点补上即可。用了输入挂。复杂度(n+m). #pragma comment(linker,"/STACK:10240000000000,10240000000000") #include #include #in原创 2014-10-01 10:49:52 · 1323 阅读 · 0 评论 -
poj2767,单向连通图判定,缩点+重新建图+新图DFS
/*该题被博客里标记为中等题,30分钟内1A,掌握了算法就简单了,单向连通图判定,单向连通图缩点 后必然唯一存在出度为0的点和入度为0的点,并且从入度为0的点出发,可以遍历所有点后到达出度为0点 (一条长链),(容易反证),所以缩点后,我重新建图(以前觉得重新建图好麻烦,现在看来SO easy), ,对新有向无环图,从入度为0的点做dfs(回溯时要标记回来,因为要所有dfs路线),有一条深度到达原创 2014-02-09 20:08:43 · 1121 阅读 · 0 评论 -
hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径
题意如上,含有重边(重边的话,俩个点就可以构成了边双连通)。 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少。这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v(level最深)该点必然是树的直径的一个端点,,再从该点出发,bfs,到最深的一点,该点深度就是直径。(证明:先假设u,是直径上一点,S,T是直径的端点,设v!=t,则有(V,U)+(U,S)>(原创 2014-07-31 22:38:26 · 1218 阅读 · 0 评论 -
hdu 2242 无向图/求用桥一分为二后使俩个bcc点权值和之差最小并输出 /缩点+2次新图dfs
题意如标题所述, 先无向图缩点,统计出每个bcc权,建新图,然后一遍dfs生成树,标记出每个点(新图)以及其子孙的权值之和。这样之后就可以dfs2来枚举边(原图的桥),更新最小即可。 调试了半天!原来是建老图时候链式前向星和新图的vector>俩种存图搞乱了!!!不可原谅!哎!愚蠢!愚不可及!提交后1A。 后来百度之后,发现说是用树形dp,看了代码解法,竟然和我原创 2014-08-19 19:34:13 · 962 阅读 · 0 评论 -
hdu3078 建层次树+在线LCA算法+排序
题意:n个点,n-1条边构成无向树,每个节点有权,Q次询问,每次或问从a->b的最短路中,权第k大的值,/或者更新节点a的权, 思路:在线LCA,先dfs生成树0,标记出层数和fa[](每个节点的父亲节点)。在对每次询问,走一遍一次公共祖先路上 的权,保持,快排。n*logn*q #include //187MS #include #include #include using原创 2014-05-15 17:08:21 · 1117 阅读 · 0 评论 -
poj1523求割点以及割后连通分量数tarjan算法应用
无向图,双向通道即可,tarjan算法简单应用。点u是割点,条件1:u是dfs树根,则u至少有2个孩子结点。||条件2:u不是根,dfn[u]= #include #include #include //用这个做链表,保存边,方便。 #include using namespace std; int subnet[1000]; //割点i有subnet[i]+1个子网络 i原创 2014-02-04 19:30:42 · 784 阅读 · 0 评论 -
poj2117求割点后最多的块。
tarjan算法,枚举割点(注意此题无向图可能不连通),每个割点分割后最大块数+连通分量-1即可。开始老是TLE,后来比较了他人代码,只在vector.>,用全局变量即可,用局部TLE。记住教训。 #include //600+MS/5000MS #include #include //用这个做链表,保存边,方便。 #include using namespace std; int原创 2014-02-04 21:02:35 · 681 阅读 · 0 评论 -
hdu4635 有向图最多添加多少边使图仍非强连通
思路:先缩点成有向无环图,则必然含有出度为0的点/入度为0的点,因为要使添加的边尽量多,最多最多也就n*(n-1)条减去原来的m条边,这样是一个强连通图,问题转化为最少去掉几条,使图不强连通,原来图中入度的点,若不添加入度,则必然不连通,同理出度为0的也一样,所以,找入度/出度为0的点中, ki(n-ki)最小的,这里KI是缩点后该SCC中的点数量,这个结果就是最小去掉的边数了。 思路清晰,1原创 2014-08-03 10:39:14 · 1636 阅读 · 0 评论 -
POJ3177,/3352.求最少添加多少边使无向图边双连通
俩个题一样。tarjan算法应用,开始求桥,WA,同一个边双连通分量中low值未必都相同,不能用此来缩点。后来用并查集来判断,若不是桥,则在一个双连通分量中,并之,后边再查,将同一个双连通分量中的点通过并查集收缩为一个并查集的“祖宗点”,间接完成缩点! 缩点成树后,(leaves+1)/2就不用说了。。。。 #include //0MS #include #includ原创 2014-02-06 12:30:48 · 830 阅读 · 0 评论 -
hdu 1827 有向图缩点看度数
题意:给一个有向图,选最少的点(同时最小价值),从这些点出发可以遍历所有。 思路:先有向图缩点,成有向树,找入度为0的点即可。 下面给出有向图缩点方法: 用一个数组SCC记录即可,重新编号,1....num,具体方法如下代码详见。 #include #include #include #include using namespace std; int n,m; vector >v(原创 2014-04-20 17:06:38 · 1142 阅读 · 0 评论 -
有向图tarjan算法求连通分量的粗浅讲解、证明, // hdu1269
打算开始重新复习一遍相关算法。对于有向图tarjan算法,通过学习过很多说法,结合自己的理解,下面给出算法自己的观点。 算法总模型是一个dfs,结合一个stack(存放当前尚未形成SCC的点集合),记录下俩个数组: dfn【i】:结点i的访问时间戳。 low[i]:i结点所能到达的祖先。 主要是俩次对low【u】的更新,一次:回溯的时候,u的孩子结点(vv)对u的更新, if(low[vv原创 2014-04-20 15:22:38 · 1466 阅读 · 0 评论 -
POJ3114 有些图缩点/改图/最短路
没想到手感还在~ 不需要重新建图,只要根据条件改改权值即可。还跑k次SPFA~ #include #include #include #include #include using namespace std; const int MAXN=600; const int MAXE=500*500*2+100; int e[MAXE][3];int head[MAXN];int nume; in原创 2015-03-19 16:10:16 · 828 阅读 · 0 评论