摘要: 题意:添加一定数目的边,构成无向双连通图 方法:一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图。把每个双连通子图收缩为一个顶点,再把桥边加回来,最后的这个图一定是一棵树,边连通度为1。统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf。则至少在树上添加(leaf+1)/2条边,就能使树达到边二连通,所以至少添加的边数就是(leaf+1)/2。具体方法为,首先把两个最近公共祖先最远的两个叶节点之间连接一条边,这样可以把这两个点到祖先的路径上所有点收缩到一起,因为一个形成的环一定是双连通的。然后再找两个... 阅读全文
posted @ 2012-02-12 21:22 AC_Von 阅读(232) 评论(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 阅读(234) 评论(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 阅读(290) 评论(0) 推荐(0) 编辑