题意:给一个无向图,问最少添加多少条边后能使整个图变成双连通分量。

思路:双连通分量缩点,缩点后给度为1的分量两两之间连边,要连(ans+1) div 2条

low[u]即为u所在的分量编号,flag=0,1,2表示没搜过,没搜完,搜完了

POJ上pascal编译器出问题了不管怎么交都CE

这次写的 应该能处理重边

 var head,vet,next,flag,dfn,low,fan,de:array[..]of longint;
n,m,i,e,v,ans,x,y,tot,time:longint; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure dfs(u,le:longint);
var e,v:longint;
begin
flag[u]:=;
inc(time); dfn[u]:=time; low[u]:=time;
e:=head[u];
while e<> do
begin
v:=vet[e];
if e=fan[le] then
begin
e:=next[e];
continue;
end;
if flag[v]= then
begin
dfs(v,e);
low[u]:=min(low[u],low[v]);
end
else if flag[v]= then low[u]:=min(low[u],dfn[v]);
e:=next[e];
end;
flag[u]:=;
end; begin for i:= to do
if i mod = then fan[i]:=i+
else fan[i]:=i-;
while not eof do
begin
readln(n,m);
if (n=)and(m=) then break;
fillchar(head,sizeof(head),);
fillchar(low,sizeof(low),);
fillchar(de,sizeof(de),);
fillchar(flag,sizeof(flag),);
tot:=; time:=;
for i:= to m do
begin
read(x,y);
add(x,y);
add(y,x);
end;
for i:= to n do
if flag[i]= then dfs(i,);
for i:= to n do
begin
e:=head[i];
while e<> do
begin
v:=vet[e];
if low[v]<>low[i] then inc(de[low[i]]);
e:=next[e];
end;
end;
ans:=;
for i:= to n do
if de[i]= then inc(ans);
writeln((ans+) div );
end; end.

这个是去年写的那时候AC了 好像不能处理重边

 var de,low,next,vet,head,flag,dfn:array[..]of longint;
n,m,tot,x,y,i,e,v,leaf,time:longint; function min(x,y:longint):longint;
begin
if x<y then exit(X);
exit(y);
end; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; procedure dfs(u,fa:longint);
var e,v:longint;
begin
inc(time);
dfn[u]:=time; low[u]:=time;
flag[u]:=;
e:=head[u];
while e<> do
begin
v:=vet[e];
if v=fa then
begin
e:=next[e];
continue;
end;
if flag[v]= then
begin
dfs(v,u);
low[u]:=min(low[u],low[v]);
end
else if flag[v]= then low[u]:=min(low[u],dfn[v]);
e:=next[e];
end;
flag[u]:=;
end; begin while not eof do
begin
readln(n,m);
if (n=)and(m=) then break;
fillchar(head,sizeof(head),);
tot:=;
for i:= to m do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
fillchar(dfn,sizeof(dfn),);
fillchar(de,sizeof(de),);
fillchar(flag,sizeof(flag),);
time:=;
for i:= to n do
if flag[i]= then dfs(i,i);
for i:= to n do
begin
e:=head[i];
while e<> do
begin
v:=vet[e];
if low[i]<>low[v] then inc(de[low[i]]);
e:=next[e];
end;
end;
leaf:=;
for i:= to n do
if de[i]= then inc(leaf);
writeln((leaf+) div );
end; end.

UPD(2018.10.18):C++

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 15000
#define M 6100000
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9 int head[N],vet[N],nxt[N],flag[N],dfn[N],low[N],fan[N],d[N],
tot,tim; void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void dfs(int u,int le)
{
flag[u]=;
dfn[u]=low[u]=++tim;
int e=head[u];
while(e)
{
int v=vet[e];
if(e==fan[le])
{
e=nxt[e];
continue;
}
if(!flag[v])
{
dfs(v,e);
low[u]=min(low[u],low[v]);
}
else if(flag[v]==) low[u]=min(low[u],dfn[v]);
e=nxt[e];
}
flag[u]=;
} int main()
{
freopen("poj3352.in","r",stdin);
freopen("poj3352.out","w",stdout);
for(int i=;i<=;i++)
if(i&) fan[i]=i+;
else fan[i]=i-;
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(head,,sizeof(head));
memset(low,,sizeof(low));
memset(d,,sizeof(d));
memset(flag,,sizeof(flag));
tot=tim=;
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=;i<=n;i++)
if(flag[i]==) dfs(i,);
for(int i=;i<=n;i++)
{
int e=head[i];
while(e)
{
int v=vet[e];
if(low[v]!=low[i]) d[low[i]]++;
e=nxt[e];
}
}
int ans=;
for(int i=;i<=n;i++)
if(d[i]==) ans++;
printf("%d\n",(ans+)/);
}
return ;
}

【POJ3352】Road Construction(边双联通分量)的更多相关文章

  1. [POJ3352]Road Construction

    [POJ3352]Road Construction 试题描述 It's almost summer time, and that means that it's almost summer cons ...

  2. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

  3. POJ 3352 Road Construction (边双连通分量)

    题目链接 题意 :有一个景点要修路,但是有些景点只有一条路可达,若是修路的话则有些景点就到不了,所以要临时搭一些路,以保证无论哪条路在修都能让游客到达任何一个景点 思路 :把景点看成点,路看成边,看要 ...

  4. 【UVA10972】RevolC FaeLoN (求边双联通分量)

    题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...

  5. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  6. HDU5409---CRB and Graph 2015多校 双联通分量缩点

    题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...

  7. poj2942(双联通分量,交叉染色判二分图)

    题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...

  8. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  9. 大白书中无向图的点双联通分量(BCC)模板的分析与理解

    对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. ...

  10. 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

随机推荐

  1. C# 替换去除HTML标记方法(正则表达式)

    [from] http://blog.csdn.net/sgear/article/details/6263848/// <summary> /// 将所有HTML标签替换成"& ...

  2. POP简单动画简单使用 (入门级别)

    动画可以让APP“更友好”的与用户交互,苹果提供很多的好看的动画供开发者使用,不过简单的平移.旋转.缩放.......使用起来很简单,但是想要进行一些比较复杂的动画效果,使用起来就比较难以实现,俗话说 ...

  3. VS快捷键总结(开发中经常遇到)

    1.窗口快捷键  (大家有没有发现但凡跟窗口挂上钩的快捷键当中都有一个W,那是因为W代表Windows也就是窗口的意思) Ctrl+W,W: 浏览器窗口 (浏览橱窗用有道的翻译是window shop ...

  4. C语言输出多位小数

    #include<stdio.h>#include<stdlib.h>int main(){int i=0;int m=19;int n=3;int s=0;s=m/n;pri ...

  5. PAT 乙级 1086

    题目 题目地址:PAT 乙级 1086 思路 本题比较简单,但还是存在小小的坑点,简单说一下: 倒置中需要注意的唯一问题就是:100倒置后不是001,而是1:这个问题处理之后还要注意另一个点就是,10 ...

  6. destoon 支付异步接口文件 notify.php 调试方式

    在if($verify_result) { 之前复制这三个变量 就可以直接访问notify.php 启用调试模式 或者 逐步echo 相关变量来调试 错误原因   notify.php没有入口文件 是 ...

  7. W3CPLUS DEMO一些有意思的效果备份

    时间轴轮播图: http://www.w3cplus.com/w3cplusDemo/demos/timeline.html css3各种图标效果: http://www.w3cplus.com/w3 ...

  8. JSON Web Token(JWT)的详解

    1.传统身份验证和JWT的身份验证 传统身份验证: HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户 ...

  9. debian 升级glibc

    原因 wheezy是2.13,编译android4.4 需要2.14的,报错如下: rebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8-linar ...

  10. debian安装中文字体

    debian刚安装完成之后,因为没有中文字体,会出现方框. 安装中文字体: $ su # apt-get install fonts-arphic-bkai00mp fonts-arphic-bsmi ...