POJ 3352 (边双连通分量)
题目链接: http://poj.org/problem?id=3352
题目大意:一个连通图中,至少添加多少条边,使得删除任意一条边之后,图还是连通的。
解题思路:
首先来看下边双连通分量的定义:
如果任意两点至少存在两条“边不重复”的路径,那么说这个图是边双连通的。
那么本题中,删除任意一条边,就可以看作是毁掉一条路径,那么只要至少还存在一条路径即可。
也就是说,转化成,求加最少的边,使这个图边双连通。
判断边双连通有两个方法:
①【局限性】编号借助low数组,如果low[u]!=low[v],就代表这两个点在不同双连通分量中。
这种方法有些小Bug,主要Bug在邻接表这样的不支持重边的数据结构上,如果有重边存在,
那么即使low[u]!=low[v],u和v也有可能存在于同一个连通分量中。
所以推荐使用链式前向星。
②Tarjin时借助并查集,由于桥(删除之后图就不连通的边)不属于任何双连通分量,所以在Tarjin时,把不是桥的边的u,v并在一起,
表示u,v在同一个双连通分量里,进行缩点。
下面来看一条结论:
若要使得任意一棵树,在增加若干条边后,变成一个双连通图,那么
至少增加的边数 =( 这棵树总度数为1的结点数 + 1 )/ 2。
这样,只需要统计一下缩点之后每个点的度数即可。
①方法low[u]中存的就是缩点编点,②方法并查集find之后也是缩点编号,degree[编号]记录度数。
注意,由于本题是无向图,对于每条边,只需degree[low[u]]++即可,不用管v。否则每个点的degree要除以2.
最后ans=(leaf+1)/2.
#include "cstdio"
#include "cstring"
#include "iostream"
using namespace std;
#define maxn 2005
struct Edge
{
int to,next;
}e[maxn*];int pre[maxn],dfs_clock,low[maxn],degree[maxn],head[maxn],tol;
void addedge(int u,int v)
{
e[tol].to=v;
e[tol].next=head[u];
head[u]=tol++;
}
int dfs(int u,int fa)
{
int lowu=pre[u]=++dfs_clock;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].to;
if(!pre[v])
{
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
}
else if(pre[v]<pre[u]&&v!=fa) lowu=min(lowu,pre[v]);
}
return low[u]=lowu;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m,u,v;
while(~scanf("%d%d",&n,&m))
{
memset(head,-,sizeof(head));
memset(pre,,sizeof(pre));
memset(low,,sizeof(low));
memset(degree,,sizeof(degree));
dfs_clock=;tol=;
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
for(int i=;i<=n;i++) if(!pre[i]) dfs(i,-);
for(int u=;u<=n;u++)
{
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].to;
if(low[u]!=low[v]) degree[low[u]]++;
}
}
int leaf=;
for(int i=;i<=n;i++)
if(degree[i]==) leaf++;
printf("%d\n",(leaf+)/);
}
}
| 2912106 | neopenx | POJ | 3352 | Accepted | 4136 | 16 | C++ | 1589 |
2014-10-31 15:22:43
|
POJ 3352 (边双连通分量)的更多相关文章
- poj 1523 SPF(双连通分量割点模板)
题目链接:http://poj.org/problem?id=1523 题意:给出无向图的若干条边,求割点以及各个删掉其中一个割点后将图分为几块. 题目分析:割点用tarjan算法求出来,对于每个割点 ...
- POJ3177(3352)(边双连通分量)
题目: 原本没有记录桥是谁,而是染色时即时判断的.后来发现不行,因为a去b可能满足low[b]>dfn[a],但b去a就不满足了. 这是因为low和dfn的关系是相对的,仅限于tarjan时的那 ...
- POJ 3352 Road Construction(边—双连通分量)
http://poj.org/problem?id=3352 题意: 给出一个图,求最少要加多少条边,能把该图变成边—双连通. 思路:双连通分量是没有桥的,dfs一遍,计算出每个结点的low值,如果相 ...
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...
- POJ 3177 Redundant Paths & POJ 3352 Road Construction(双连通分量)
Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numb ...
- POJ 3352 Road Construction(边双连通分量,桥,tarjan)
题解转自http://blog.csdn.net/lyy289065406/article/details/6762370 文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...
- POJ 3352 Road Construction (边双连通分量)
题目链接 题意 :有一个景点要修路,但是有些景点只有一条路可达,若是修路的话则有些景点就到不了,所以要临时搭一些路,以保证无论哪条路在修都能让游客到达任何一个景点 思路 :把景点看成点,路看成边,看要 ...
- POJ 3352 无向图边双连通分量,缩点,无重边
为什么写这道题还是因为昨天多校的第二题,是道图论,HDU 4612. 当时拿到题目的时候就知道是道模版题,但是苦于图论太弱.模版都太水,居然找不到. 虽然比赛的时候最后水过了,但是那个模版看的还是一知 ...
- poj 3352 双连通分量
至少加几条边成为双连通分量 #include <iostream> #include <cstdio> #include <cstring> using names ...
随机推荐
- different between unicorn / unicorn_rails
$ unicorn_rails -h Usage: unicorn_rails [ruby options] [unicorn_rails options] [rackup config file] ...
- Linux系统管理员面试50题
命令nslookup是做什么的? Nslookup 是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具. 你如何把CPU占用率最高的进程显示出来? top -c 按照cpu排序 如果 ...
- BZOJ 3540 realtime-update 解题
分析一下题意,大约是给定一串牛,然后找到一个跨越距离最长的牛子串使得在这个范围内白牛和花牛一样多. 白牛可以任意涂成花牛. 既然"白牛可以任意涂成花牛",那么我们需要找到一个最长的 ...
- 二模 06day2
很长时间没更新有意义的题目了呢,这是一套题撒,于是乎我便开心的边刷题边发题解了撒. 第一题: interval 比较好玩的一题撒, 分分钟过了, 就是模拟贪吃蛇但是没有食物(嗯,只要你判断冲突). 整 ...
- Myeclipse中全部文件设置成UTF-8
如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简 ...
- 【读书笔记】读《JavaScript模式》 - JavaScript函数常用模式
API模式:回调模式.配置对象.返回函数: 初始化模式:即时函数.即时对象初始化.初始化分支: 性能模式:备忘模式.自定义模式 //*********************** API模式 **** ...
- Linux开发cocos2dx程序环境搭建
安装linux系统,ubuntu 14.04 64位 安装支持软件 sudo apt-get update sudo apt-get install git ssh vim ctags qt-sdk ...
- 各大OJ
北大POJ 杭电HDU 浙大ZOj 蓝桥杯 PAT
- 一、HTML和CSS基础--HTML+CSS基础课程--第3部分
第五章 CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌入式和外部式三种. 内联式cs ...
- (转)浅谈MD5加密算法中的加盐值(SALT)
我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就 ...