POJ3177(3352)(边双连通分量)
题目:
原本没有记录桥是谁,而是染色时即时判断的。后来发现不行,因为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)(边双连通分量)的更多相关文章
- POJ 3352 (边双连通分量)
题目链接: http://poj.org/problem?id=3352 题目大意:一个连通图中,至少添加多少条边,使得删除任意一条边之后,图还是连通的. 解题思路: 首先来看下边双连通分量的定义: ...
- poj3177 && poj3352 边双连通分量缩点
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12676 Accepted: 5368 ...
- poj3177(边双连通分量+缩点)
传送门:Redundant Paths 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立 ...
- POJ3177 Redundant Paths 双连通分量
Redundant Paths Description In order to get from one of the F (1 <= F <= 5,000) grazing fields ...
- POJ 3352 Road Construction(边—双连通分量)
http://poj.org/problem?id=3352 题意: 给出一个图,求最少要加多少条边,能把该图变成边—双连通. 思路:双连通分量是没有桥的,dfs一遍,计算出每个结点的low值,如果相 ...
- 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 ...
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...
- POJ3177 Redundant Paths(边双连通分量+缩点)
题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径. 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是 ...
- POJ 3352 Road Construction(边双连通分量,桥,tarjan)
题解转自http://blog.csdn.net/lyy289065406/article/details/6762370 文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...
随机推荐
- 生成图片验证码(.NET)
一.生成随机字符串 方法一: public string CreateRandomCode(int codeCount) { string allChar = "0,1,2,3,4,5,6, ...
- 数据库SQL优化(百万级数据库优化方案)
1. 对查询进行优化 要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2. where 子句 要尽量避免在 where 子句中对字段进行 null 值判断.( ...
- 【转】ASP.NET Core API 版本控制
几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...
- 4.18n阶勒让德多项式求解
Q:编写程序,输入正整数n和任意数x,求出勒让德多项式的值Pn(x) #include <iostream> #include<cstdio> using namespace ...
- avalon 路由问题
1, 直接使用avalon的 amd加载器, 可以不需要 require.js 2, 配置baseUrl 路径, 这个一定要在 js所在的目录, 而不是jsp所在的目录, 如果js 和jsp分开 ...
- 一张图让你学会Python
有编程基础的人一看就可以了解 Python 的用法了.真正的 30 分钟上手.国外一高手画的,现把它翻译成中文,入门超简单python入门神图 *单击放大
- E - 追求
经历了那晚的竹林深处相识后静竹对数学念念不忘,产生了好感!为了追求数学,她想到了一招,要想搞定女友,搞定闺中密友.于是,她秘密与数学的好友斐波那契见面了.学数学的真是不一样,斐波那契的出现前提也是需要 ...
- exit和return
函数名: exit() 所在头文件:stdlib.h(如果是”VC6.0“的话头文件为:windows.h) 功 能: 关闭所有文件,终止正在执行的进程. exit(1)表示异常退出.这个1是返回给操 ...
- C高级第四次作业
作业要求一 最简单的wordcount 具体要求:http://www.cnblogs.com/xinz/p/7426280.html 1.设计思路: 0.0版本设计思路: 第一步:读入用户想要操作的 ...
- gcc -o test test.c编译报错
报错内容 /tmp/cc7eQyD4.o: In function `main':test.c:(.text+0x51): undefined reference to `sqrt'collect2: ...