为什么写这道题还是因为昨天多校的第二题,是道图论,HDU 4612。

当时拿到题目的时候就知道是道模版题,但是苦于图论太弱。模版都太水,居然找不到。

虽然比赛的时候最后水过了,但是那个模版看的还是一知半解,主要还是对于无向图缩点不了解。

所以今天特意找了道求无向图边双连通分量,然后缩点的题学习一下,这道题的缩点和昨天那道差不多,唯一的区别就是这是无重边的,那题是有重边的。

先搞掉这个,下午把有重边的缩点搞一下。

这里给出一些概念。具体可以到神牛博客看一下。

边连通度:使一个子图不连通的需要删除掉的最小边数,就是该图的边连通度。

桥(割边) :删除某条边时,该图不再连通,那么这条边就是该图的桥(割边)。

边双连通分量:边连通度大于等于2的子图称为边连通分量。

一个边连通分量里面的任意两点,都有2条或者2条以上的路可以互相到达。

这道题的题意,给出N个点M条边,都是无向的。

然后叫你求,最少增加多少条边,可以是的整个图成为一个边双联通分量 。

思路:求出所有的边连通分量,设数量为cnt,然后将一个边连通分量中的点缩成一个块,然后重新建图,这样我们就得到了一棵节点数为cnt ,边数为cnt - 1,的树。

该树上的所有边都是桥。

然后要使得这个图成为一个边连通分量,那么只需将所有的叶子节点连起来即可。

所有最后的答案就是(叶子节点的个数+ 1) / 2。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2505
#define inf 1<<28
#define LL(x) ( x << 1 )
#define RR(x) ( x << 1 | 1 )
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define PII pair<int,int>
using namespace std; inline void RD(int &ret) {
char c;
do {
c = getchar();
} while(c < '0' || c > '9') ;
ret = c - '0';
while((c=getchar()) >= '0' && c <= '9')
ret = ret * 10 + ( c - '0' );
}
int n , m ;
struct kdq{
int e , next ;
}ed[111111] ,bridge[1111] ,reed[11111] ;
int head[1111] ,num ,rehead[11111] ,renum ;
int low[1111] ,dfn[1111] ;
int st[11111] ;
int fa[1111] ;
bool vis[1111] ;
int dp ; //tarjan的层数
int top ;//栈顶
int bridgenum ;//桥的数量
int cnt ;//缩点后联通块的数量
//可以知道,cnt = bridge + 1
//缩点后,重新建图,所有节点都是一个联通块,所有的边都是桥。故有上述结论。
void init(){
mem(rehead , -1) ;
renum = 0 ;
mem(head , -1) ;
num = 0 ;
dp = 0 ;
top = 0 ;
bridgenum = 0 ;
cnt = 0 ;
mem(low ,0) ;
mem(dfn ,0) ;
mem(fa,-1) ;
mem(vis, 0 ) ;
}
void add(int s ,int e){
ed[num].e = e ;
ed[num].next = head[s] ;
head[s] = num ++ ;
}
void readd(int s ,int e){
reed[renum].e = e ;
reed[renum].next = rehead[s] ;
rehead[s] = renum ++ ;
}
/***模版求无向图的双联通分量,缩点,求出桥(无重边)***/
void tarjan(int now ,int faa){
dfn[now] = low[now] = dp ++ ;
st[++ top] = now ;
for (int i = head[now] ; ~i ;i = ed[i].next ){
int e = ed[i].e ;
if(e == faa)continue ;
if(dfn[e] == 0){
tarjan(e ,now) ;
if(low[e] < low[now])low[now] = low[e] ;
if(low[e] > dfn[now]){
bridge[bridgenum].e = now ;//桥
bridge[bridgenum ++].next = e ;
cnt ++ ;
do{
fa[st[top]] = cnt ;//缩点
}while(st[top --] != e) ;
}
}else if(low[now] > dfn[e])low[now] = dfn[e] ;
}
}
/***重新建图***/ void rebuild(){
for (int i = 1 ; i <= n ; i ++ ){
for (int j = head[i] ; ~j ; j = ed[j].next){
readd(fa[i], fa[ed[j].e]) ;
readd(fa[ed[j].e] ,fa[i]) ;
}
}
}
int ans = 0 ;
int root = -1 ;
void dfs(int now ,int faa){
vis[now] = 1 ;
int sum = 0 ;
for(int i = rehead[now] ; ~i ;i = reed[i].next){
int e = reed[i].e ;
if(e == faa)continue ;
if(vis[e])continue ;
sum ++ ;
dfs(e,now) ; }
if(!sum)ans ++ ;
}
void solve(){
ans = 0 ;
rebuild() ;
dfs(root ,-1) ;
if(cnt == 1)puts("0") ;
else
printf("%d\n",(ans + 1) / 2) ;
}
int main() {
while(cin >> n >> m){
init() ;
while(m -- ){
int a , b ;
RD(a) ;RD(b) ;
add(a , b) ;
add(b , a) ;
} for (int i = 1 ;i <= n ;i ++ ){//可以处理不连通的图,如果连通的话,这个循环只进行一次。
if(dfn[i] == 0){
top = dp = 1 ;
tarjan(i , -1) ;
++ cnt ;
for (int j = 1 ; j <= n ;j ++ ){//特殊处理顶点的连通块
if(dfn[j] && fa[j] == -1)fa[j] = cnt ,root = cnt;
}
}
}
solve() ; }
return 0 ;
}

POJ 3352 无向图边双连通分量,缩点,无重边的更多相关文章

  1. HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)

    Problem Description City C is really a nightmare of all drivers for its traffic jams. To solve the t ...

  2. POJ3177 Redundant Paths(边双连通分量+缩点)

    题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径. 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是 ...

  3. Expm 9_3 无向图的双连通分量问题

      [问题描述] 给定一个无向图,设计一个算法,判断该图中是否存在关节点,并划分双连通分量. package org.xiu68.exp.exp9; import java.util.Stack; p ...

  4. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  5. poj 3177 Redundant Paths(边双连通分量+缩点)

    链接:http://poj.org/problem?id=3177 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任 ...

  6. poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)

    #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #includ ...

  7. 图论-桥/割点/双连通分量/缩点/LCA

    基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...

  8. poj3177(边双连通分量+缩点)

    传送门:Redundant Paths 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立 ...

  9. POJ3352 Road Construction 双连通分量+缩点

    Road Construction Description It's almost summer time, and that means that it's almost summer constr ...

随机推荐

  1. Java学习笔记--Collection和Collections的区别

    转自 http://pengcqu.iteye.com/blog/492196 比较Collection 和Collections的区别.   1.java.util.Collection 是一个集合 ...

  2. shell下 使用心得

    打印时间的命令 date +'%F %k:%M:%d' crontab启动计划任务,注意两件事情: 1)crontab里启动的脚本,如果需要读取文件,需要使用绝对路径,或者在脚本里cd到目录所在的绝对 ...

  3. FJ省队集训最终测试 T3

    思路:状态压缩dp,f[i][j[[k]代表i行j列这个格子,连续的状态为k,这个连续的状态是什么?就是下图 X格子代表我当前走到的地方,而这里的状态就是红色部分,也就是连续的一段n的状态,我们是分每 ...

  4. IIC总线协议---以存储芯片at24c64为例

    IIC总线协议 前言:年前给老师做个红外抄表系统,,现在对当中用到的一些模块总结一下. 1.只有在总线空闲时才允许启动数据传送. 2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允 ...

  5. UVA11922--Permutation Transformer (伸展树Splay)

    题意:m条操作指令,对于指令 a  b 表示取出第a~b个元素,翻转后添加到排列的尾部. 水题卡了一个小时,一直过不了样例.  原来是 dfs输出的时候 忘记向下传递标记了. #include < ...

  6. 关于Spring中的PagedListHolder分页类的分析

    PagedListHolder 这个类可以 对分页操作进行封装 文件在:import org.springframework.beans.support.PagedListHolder;下 默认是把查 ...

  7. C# 图结构操作

    仿造<<Java常用算法手册>>里面对的算法,使用C#实现了一遍. 理论知识我就不讲解了,在这本书里面已经写的非常完美! 代码如何下: using System; using ...

  8. (转)Iphone数组一些基础操作 NSArray/NSMutableArray

    /******************************************************************************************* NSArray ...

  9. Javascript:一个优雅的时钟

    实现效果: 准备工作: 1# 定时器 相关知识了解 2#javascript Date(日期)对象 3# 准备效果所用图片 实现原理: 1# 获取当前时间: var time=new Date(); ...

  10. Spring3 MVC 之 Hello Word

    开发工具: MyEclipse  10.0 项目目录: [http://www.cnblogs.com/rhythmK/] 1.新建项目:File->New->Web Project  项 ...