随笔分类 -  图论——强连通&双连通

摘要:无向图的Tarjan和有向图求强连通分量的Tarjan很像...注意几个不同... 1、没有栈..所以判断时先是看点有没有访问过...else的时候就直接更新Low...不需要再来个判断instack.... 2、DFS时不能从 a 递归到了 b..b又马上从a来更新...所以要多加一个notpre..代表递归b时是从哪个点进去的...防止这种情况.. 3、Low相等的点在无向图中就是在一个双连通图中...这个比有向图的方便..有向图还需要用栈来维护..通过判断退栈来判断强连通分量..摘自:http://blog.csdn.net/kk303/article/details/6881034.. 阅读全文
posted @ 2012-04-25 22:07 AC_Von 阅读(1412) 评论(0) 推荐(0) 编辑
摘要:图算法差分约束系统的建立和求解poj1201(1716类似),poj2983, poj3159poj1275, poj1364最小(大)费用最大流poj2516, poj2195, poj3422(最大费用最大流)poj2135(很裸的最小费用最大流,不过有一个大坑。。。)双连通分量poj2942,poj3694强连通分支及其缩点poj2186, poj3592, poj3114图的割边和割点poj3352(外加3117)最小割模型poj3308, poj3155(偏难)详见:http://www.cnblogs.com/vongang/archive/2012/10/25/274004... 阅读全文
posted @ 2012-04-14 21:02 AC_Von 阅读(861) 评论(0) 推荐(0) 编辑
摘要:题意,给出每个儿子喜欢的mm的编号,然后再给一个原定的配对序列,求出每个儿子可以泡的mm,并保证每个儿子都有mm泡。 思路:看得大牛的思路,比如儿子u喜欢mm v,则u -> v建一条边。给出的配对序列中,儿子u要泡v则 v -> u建一条边。然后得到一个有向图,然后求出强连通分量。就ok啦ps:1wa没有初始化,2wa结果没有排序输出。。。一个国王搞出2000个儿子,Orz~~渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #inclu 阅读全文
posted @ 2012-02-13 15:37 AC_Von 阅读(281) 评论(0) 推荐(0) 编辑
摘要:题意:添加一定数目的边,构成无向双连通图 方法:一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图。把每个双连通子图收缩为一个顶点,再把桥边加回来,最后的这个图一定是一棵树,边连通度为1。统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf。则至少在树上添加(leaf+1)/2条边,就能使树达到边二连通,所以至少添加的边数就是(leaf+1)/2。具体方法为,首先把两个最近公共祖先最远的两个叶节点之间连接一条边,这样可以把这两个点到祖先的路径上所有点收缩到一起,因为一个形成的环一定是双连通的。然后再找两个... 阅读全文
posted @ 2012-02-12 21:22 AC_Von 阅读(239) 评论(0) 推荐(0) 编辑
摘要:题意:求割点,并求出割点删掉后剩下的连通块数渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N = 1005; 8 const int M = 100000; 9 const int inf = ~0u>>2;10 11 struct node {12 int to;13 int next;14 } g[M];15 16 int head[N], cut[N];17 阅读全文
posted @ 2012-02-12 15:25 AC_Von 阅读(240) 评论(0) 推荐(0) 编辑
摘要:题意:求一个图中删掉一个结点所得到的连通块数量最大。 思路:设一个结点u,如果u是根结点(图可能是不连通的,所以可能有多个根结点)则删掉u所增加的连通块数为 SUM(u的子结点) - 1;如果u是非根结点,v是u的子结点,则删掉u所增加的连通块数为 SUM(u->v为割边, 既u是到v的割点);渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <stack> 5 6 using namespace std; 7 8 阅读全文
posted @ 2012-02-12 10:12 AC_Von 阅读(295) 评论(0) 推荐(0) 编辑
摘要:求出强连通分量,缩点。得到新图DAG, 求DAG中max(入度为0的点数,出度为0的点数);渣代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 6 using namespace std; 7 8 const int N = 20010; 9 const int M = 50010; 10 11 struct node { 12 int to; 13 node* next; 14 } *first[M]; 阅读全文
posted @ 2012-02-11 20:51 AC_Von 阅读(273) 评论(0) 推荐(0) 编辑
摘要:题目描述很吓人。。。题意就是求出强连通分量,然后缩点得到DAG, 求DAG中出度为0的缩点,并输出缩点包含的集合(可能有多个这样的缩点)渣代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int N = 5010; 10 const int M = 51000; 11 12 stru 阅读全文
posted @ 2012-02-11 19:55 AC_Von 阅读(228) 评论(0) 推荐(0) 编辑
摘要:将强连通分量进行缩点,然后找缩点后的图中出度为0的缩点所包含的结点数,就是最后结果。如果出现多个出度为0的缩点,则表示不存在所求的点。渣代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 6 using namespace std; 7 8 const int M = 50010; 9 const int N = 10010;10 11 struct node {12 int to;13 int next; 阅读全文
posted @ 2012-02-11 16:51 AC_Von 阅读(381) 评论(0) 推荐(0) 编辑
摘要:Tarjan 它好贱,wa了10+次。。。 思路:用“它贱”进行强连通缩点。然后统计缩点后的图中入度为0的点的个数in和出度为0的点到个数out。A就是in, B就是max(in, out);渣代码:View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <stack> 5 6 using namespace std; 7 8 const int N = 110; 9 10 struct node {11 int to;12 int n 阅读全文
posted @ 2012-02-11 14:59 AC_Von 阅读(243) 评论(0) 推荐(0) 编辑
摘要:转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html基本概念:1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点。2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。3.点连通度:最小割点集合中的顶点数。4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图。5.割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。6.边连通度:一个图 阅读全文
posted @ 2012-02-10 11:10 AC_Von 阅读(1325) 评论(0) 推荐(0) 编辑
摘要:转载自:http://www.byvoid.com/blog/scc-tarjan/zh-hans/[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是 阅读全文
posted @ 2012-02-10 11:07 AC_Von 阅读(407) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示