题目:

原本没有记录桥是谁,而是染色时即时判断的。后来发现不行,因为a去b可能满足low[b]>dfn[a],但b去a就不满足了。

这是因为low和dfn的关系是相对的,仅限于tarjan时的那棵dfs搜索树中。染色时没有按那棵树走,就不能用dfn和low了!

累加ans时可以把边+=2,很方便。

别忘了写v=edge[i].to。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,r,head[],xnt=,dfn[],low[],col[];
int x,y,tim,cnt,d[],ans;
bool b[][],brg[];
struct Edge{
int next,to,from;
Edge(int n=,int t=,int f=):next(n),to(t),from(f) {}
}edge[];
void dfs(int cur,int fa)
{
// printf("cur=%d\n",cur);
dfn[cur]=low[cur]=++tim;
for(int i=head[cur],v;i;i=edge[i].next)
{
if(dfn[v=edge[i].to]&&v!=fa)
low[cur]=min(low[cur],dfn[v]);
if(!dfn[v])
{
dfs(v,cur);
low[cur]=min(low[cur],low[v]);
if(low[v]>dfn[cur])brg[i]=,brg[i^]=;
}
}
// printf("cur=%d dfn=%d low=%d\n",cur,dfn[cur],low[cur]);
}
void cl(int cur,int fa)
{
col[cur]=cnt;
// printf("cur=%d col=%d\n",cur,cnt);
for(int i=head[cur],v;i;i=edge[i].next)
{
if(edge[i].to==fa||brg[i])continue;
// printf("v=%d lowv=%d dfncur=%d\n",edge[i].to,low[edge[i].to],dfn[cur]);
// if(low[v=edge[i].to]<=dfn[cur]&&!col[v])cl(v,cur);//避免环的死循环 //a去b是桥,b去a就不一定了
if(!col[v=edge[i].to])cl(v,cur);//
}
}
int main()
{
// freopen("POJ3177.in","r",stdin);
// freopen("poj3177.out","w",stdout);
// while(1)
// {
// xnt=1;cnt=0;ans=0;tim=0;
// memset(b,0,sizeof b);
// memset(col,0,sizeof col);
// memset(dfn,0,sizeof dfn);
// memset(low,0,sizeof low);
// memset(head,0,sizeof head);
// memset(d,0,sizeof d);
// memset(brg,0,sizeof brg);
scanf("%d%d",&n,&r);
for(int i=;i<=r;i++)
{
scanf("%d%d",&x,&y);
if(!b[x][y])
{
b[x][y]=;b[y][x]=;
edge[++xnt]=Edge(head[x],y,x);head[x]=xnt;
edge[++xnt]=Edge(head[y],x,y);head[y]=xnt;
}
}
dfs(,);
for(int i=;i<=n;i++)
if(!col[i])
{
cnt++;cl(i,);
}
for(int i=;i<=xnt;i+=)
if(col[edge[i].from]!=col[edge[i].to])
// if(brg[i])
{
d[col[edge[i].from]]++;d[col[edge[i].to]]++;
// brg[i]=0;
// brg[i^1]=0;
}
for(int i=;i<=cnt;i++)
if(d[i]==)ans++;
printf("%d\n",(ans+)/);
// }
return ;
}

POJ3177(3352)(边双连通分量)的更多相关文章

  1. POJ 3352 (边双连通分量)

    题目链接: http://poj.org/problem?id=3352 题目大意:一个连通图中,至少添加多少条边,使得删除任意一条边之后,图还是连通的. 解题思路: 首先来看下边双连通分量的定义: ...

  2. poj3177 && poj3352 边双连通分量缩点

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12676   Accepted: 5368 ...

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

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

  4. POJ3177 Redundant Paths 双连通分量

    Redundant Paths Description In order to get from one of the F (1 <= F <= 5,000) grazing fields ...

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

    http://poj.org/problem?id=3352 题意: 给出一个图,求最少要加多少条边,能把该图变成边—双连通. 思路:双连通分量是没有桥的,dfs一遍,计算出每个结点的low值,如果相 ...

  6. 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 ...

  7. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

     http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...

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

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

  9. POJ 3352 Road Construction(边双连通分量,桥,tarjan)

    题解转自http://blog.csdn.net/lyy289065406/article/details/6762370   文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...

随机推荐

  1. 使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传

    package org.caeit.cloud.dev.util; import java.io.File; import java.io.IOException; import java.io.Un ...

  2. mysql判断表记录是否存在,不存在则插入新纪录

    开始以为和SQL Server一样,使用not exists进行判断,结果不行: ) INSERT INTO vrv_paw_template(templateName,templateFileNam ...

  3. 快速切题 sgu104. Little shop of flowers DP 难度:0

    104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB PROBLEM Yo ...

  4. css 初始包含块

    continuous media ,paged media 关于continuous media[连续媒体]和paged media[分页媒体] 直白的讲,continuous和paged media ...

  5. windows下运用批处理实现一键自动开启多个应用

    工作时,我每天早上到公司,打开自己的电脑,都会有几个固定的软件(myeclipse,飞信,firefox,foxmail等).文件夹和文件需要打开,每天如此,感到很烦,浪费时间做重复的工作,于是想到一 ...

  6. XE里, TStringField 还是 ansi的

    { TStringField } TStringField = class(TField) private FFixedChar: Boolean; FTransliterate: Boolean; ...

  7. python爬虫田康林

       代码如下 import requestsimport json import time import os from threading import Timer def getHTML(url ...

  8. L1-013 计算阶乘和

    对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!. 输入格式: 输入在一行中给出一个不超过10的正整数N. 输出格式: 在一行中输出S的值. 输入样例: 3 输出样例: 9   #i ...

  9. L1-011 A-B

    本题要求你计算A−B.不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B. 输入格式: 输入在2行中先后给出字符串A和B.两字符串的长度 ...

  10. DevExpress WPF入门指南:加载动画的应用

    LoadingDecorator是一个容器控件用于显示 long-loading 的内容.内容还没加载完成的时候会显示一个加载指示器,加载完成后指示器消失,如下图所示: 开启LoadingDecora ...