随笔分类 -  tarjan

摘要:链接:http://wikioi.com/problem/1036/题意不写了。思路:很明显找到lca然后用两个点的深度相加-lca的深度就是这一步的最近步数。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define loop(s,i,n) for(i = s;i g[maxn]; 16 int find(int x) 17 { 18 if(set[x] != x) 19 set[x] = find(set[x]); 20 21 ... 阅读全文
posted @ 2013-10-03 00:48 某某。 阅读(266) 评论(0) 推荐(0)
摘要:题目大意:给定一些城市,然后再给一些寄信的路信,A,B,H代表把信从A城市寄到B城市需要H小时。如果没有直接可以寄达的,可以先通过另外一个城市到达,比如A,B可以寄信,B,C可以寄信,那么,A,C也可以寄信。其中两个城市之间如果可以相互寄信的话,那么这两个城市是属于一个国家的,寄信可以通过电子邮件,所以所需的时间为0.题目中有K个询问,输入A,B询问A到B之间寄信最少需要多少时间。连接:http://poj.org/problem?id=3114距离为零肯定就是强连通分量嘛~。一开始是打算用的缩点FLOYD,结果超时。但是搜了一下,有人用floyd就不超时,叫秦川看了下,秦川也不晓得,他自己写 阅读全文
posted @ 2013-08-12 20:07 某某。 阅读(194) 评论(0) 推荐(0)
摘要:题意:一个连通的无向图,求至少需要添加几条边,救能保证删除任意一条边,图仍然是连通的。链接:http://poj.org/problem?id=3352思路:边的双连通图。其实就是要求至少添加几条边,可以使整个图成为一个边双连通图。用tarjan算法(求割点割边)求出low数组,这里可以简化,然 后依据“low相同的点在一个边连通分量中”,缩点之后构造成树(这里可以直接利用low[]数组,low[i]即为第i节点所在的连通分量的标号)。求 出树中出度为1的节点数left,答案即为(leaf+1)/2。代码: 1 #include 2 #include 3 #include 4 #... 阅读全文
posted @ 2013-08-12 02:23 某某。 阅读(399) 评论(0) 推荐(0)
摘要:问加一条边,最少可以剩下几个桥。先双连通分量缩点,形成一颗树,然后求树的直径,就是减少的桥。本题要处理重边的情况。如果本来就两条重边,不能算是桥。还会爆栈,只能C++交,手动加栈了别人都是用的双连通分量,我直接无向图改成有向图搞得强连通水过。 1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 using namespace std; ... 阅读全文
posted @ 2013-08-11 17:49 某某。 阅读(436) 评论(0) 推荐(0)
摘要:先说一下割点跟割边吧。割桥就是如果一个连通图里删除这条边之后,这个图会变成两个连通图,那么这条边就称之为割桥。这是割桥的代码,里面呆着lca求法。割点和割桥的就是用一个时间戳和回到祖先确定。用dfs的时间戳可以看出。割点为low[v] >= dfn[u]割边为low[v] > dfn[u]。但是要注意的是割点的条件对于搜索树的根节点是要特殊处理的,当根节点的孩子大于1的时候就一定是割点。 1 void tarjan(int u,int pre) 2 { 3 int v,i,j; 4 dfn[u] = low[u] = ++dfsclock; 5 loop(0,i,g[u... 阅读全文
posted @ 2013-08-11 17:14 某某。 阅读(148) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=3592题意:题目大意:给定一个矩阵,西南角为出发点,每个单位都有一订价值的金矿(#默示岩石,不成达,*默示时佛门,可以达到指定单位),队#外,每个点只能向右走或向下走,并且可以反复经过一个点。如今请求得最多可以获得多大好处。一开始看到这个题,会以为是费用流。但是计划上是在tarjan上的。我觉得如果比赛的时候有这道题估计我也就挂了。因为这个图大部分的点只有两个后续节点, 但是*会有更多的节点,所以说这样会产生环,因此可以吧整个图求强连通进行缩点,因为每个强连通分量重的点你是可以得到她所有的值。不管走几次,就是那么多,缩完点之后就可以构 阅读全文
posted @ 2013-08-07 15:41 某某。 阅读(678) 评论(0) 推荐(0)
摘要:题意:给你一个连通图,问你最多加多少条边,还能保证该图不是强连通图。对整个图求强连通分量,然后对图缩点,记录一下缩点之后每隔点包含的原来的点的个数,找出最少的那个点,然后对这个点建成完全图,对另外的所有点建成完全图。然后+两个点建边-所有原来的遍就好了。链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std; 10 c... 阅读全文
posted @ 2013-08-03 10:54 某某。 阅读(204) 评论(0) 推荐(0)
摘要:Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html基本概念:1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。3.点连通度:最小割点集合中的顶点数。4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图。5.割边集合:如 阅读全文
posted @ 2013-07-31 14:23 某某。 阅读(2379) 评论(0) 推荐(0)
摘要:题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥。一个最容易想到的办法就是先加边找桥,加边找桥,这样可定超时。那么就可以缩点,因为如果一条边不是桥那么无论怎么加边他肯定都不会变成桥,这样我吧不是桥的点缩成一个点。这样全图就都是桥,这样的话,我们就在加的遍里面去找如果加的边是同一个点,那么,肯定不会减少桥,但是如果不是同一个,那么桥肯定减少~。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #defin... 阅读全文
posted @ 2013-07-31 14:21 某某。 阅读(579) 评论(0) 推荐(0)
摘要:题解:http://blog.csdn.net/lyy289065406/article/details/6756821讲的很详细我就不多说了。题目连接:http://poj.org/problem?id=2942代码(完全白书上的) 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define loop(s,i,n) for(i = s;i g[maxn],bcc[maxn]; 15 struct edge 16 { 17 ... 阅读全文
posted @ 2013-07-30 18:50 某某。 阅读(481) 评论(0) 推荐(0)
摘要:链接:http://poj.org/problem?id=2186题意:给你N个点,然后在给你N条有向边,然后让你找出这样的点S,S满足条件图上任意一点都能到达S。要想满足任意一点都能到达,首先满足图连通,然后满足将图缩点后形成一个棵树,树的特征是可以有且只有一个点的出度为0。然后代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 9 using namespace std; 10 const int maxn = 50050; 11 12 ... 阅读全文
posted @ 2013-07-29 21:39 某某。 阅读(208) 评论(0) 推荐(0)