POJ 3177 Redundant Paths

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 12598   Accepted: 5330

Description

In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten Apples. The cows are now tired of often being forced to take a particular path and want to build some new paths so that they will always have a choice of at least two separate routes between any pair of fields. They currently have at least one route between each pair of fields and want to have at least two. Of course, they can only travel on Official Paths when they move from one field to another.

Given a description of the current set of R (F-1 <= R <= 10,000) paths that each connect exactly two different fields, determine the minimum number of new paths (each of which connects exactly two fields) that must be built so that there are at least two separate routes between any pair of fields. Routes are considered separate if they use none of the same paths, even if they visit the same intermediate field along the way.

There might already be more than one paths between the same pair of fields, and you may also build a new path that connects the same fields as some other path.

Input

Line 1: Two space-separated integers: F and R

Lines 2..R+1: Each line contains two space-separated integers which are the fields at the endpoints of some path.

Output

Line 1: A single integer that is the number of new paths that must be built.

Sample Input

7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7

Sample Output

2

Hint

Explanation of the sample:

One visualization of the paths is:

   1   2   3
+---+---+
| |
| |
6 +---+---+ 4
/ 5
/
/
7 +

Building new paths from 1 to 6 and from 4 to 7 satisfies the conditions.

   1   2   3
+---+---+
: | |
: | |
6 +---+---+ 4
/ 5 :
/ :
/ :
7 + - - - -

Check some of the routes: 
1 – 2: 1 –> 2 and 1 –> 6 –> 5 –> 2 
1 – 4: 1 –> 2 –> 3 –> 4 and 1 –> 6 –> 5 –> 4 
3 – 7: 3 –> 4 –> 7 and 3 –> 2 –> 5 –> 7 
Every pair of fields is, in fact, connected by two routes. 
It's possible that adding some other path will also solve the problem (like one from 6 to 7). Adding two paths, however, is the minimum.

 /*这是一个63分的代码,因为没有注意到题目中的重边问题,以后要注意有重边的图和没有重边的图的tarjan求桥的算法,是不同的*/
#include<iostream>
using namespace std;
#include<cstdio>
#define N 5001
#define R 10010
#include<stack>
#include<queue>
#include<cstring>
queue<int>que;
bool qiao[R]={},visit[N]={},visit_edge[R<<];
struct Edge{
int u,v,last;
}edge[R*];
int head[N],du[N],f,r,father[N],dfn[N],low[N],topt=,t=-;
int ans[N]={};
void add_edge(int u,int v)
{
++t;
edge[t].u=u;
edge[t].v=v;
edge[t].last=head[u];
head[u]=t;
}
void input()
{
memset(head,-,sizeof(head));
int u,v;
scanf("%d%d",&f,&r);
for(int i=;i<=r;++i)
{
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
r<<=;
}
void tarjan(int u)
{
dfn[u]=low[u]=++topt;
for(int l=head[u];l!=-;l=edge[l].last)
{
int v=edge[l].v;
if(!visit_edge[l]&&!visit_edge[l^])
{
visit_edge[l]=true;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) qiao[l]=true;
}
else low[u]=min(low[u],dfn[v]);
}
}
}
void suo_dian()
{
for(int i=;i<=f;++i)
{
if(!visit[i])
{
ans[++ans[]]=i;
que.push(i);
visit[i]=true;
while(!que.empty())
{
int x=que.front();
father[x]=i;
que.pop();
for(int l=head[x];l!=-;l=edge[l].last)
{
if(qiao[l]||visit[edge[l].v]) continue;
que.push(edge[l].v);
visit[edge[l].v]=true;
}
} }
}
}
void re_jiantu()
{
for(int l=;l<=r;++l)
{
if(father[edge[l].u]!=father[edge[l].v])
{
du[father[edge[l].u]]++;
du[father[edge[l].v]]++;
}
}
}
int main()
{
freopen("rpaths.in","r",stdin);
freopen("rpaths.out","w",stdout);
input();
for(int i=;i<=f;++i)
{
if(!dfn[i])
tarjan(i);
}
suo_dian();
re_jiantu();
int sum=;
for(int i=;i<=ans[];++i)
if(du[ans[i]]==)
sum++;
printf("%d\n",(sum+)/);
fclose(stdin);fclose(stdout);
return ;
}

正确代码及模板:

 #define N 5011
#include<iostream>
using namespace std;
#define M 10010
#include<cstdio>
#include<cstring>
struct Gra{
int n,m,ans,head[N],topt,dfn[N],low[N],t,cnt[N];
bool visit[M<<];
struct Edge{
int v,last;
}edge[M<<];
void init(int f,int r)
{/*初始化不要在上面,上面只是声明,不是变量*/
ans=,topt=,t=-;
n=f;m=r;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(cnt,,sizeof(cnt));
memset(visit,false,sizeof(visit));
}
void add_edge(int x,int y)
{
++t;
edge[t].v=y;
edge[t].last=head[x];
head[x]=t;
}
void tarjan(int u)
{
dfn[u]=low[u]=++topt;
for(int l=head[u];l!=-;l=edge[l].last)
{
if(visit[l]) continue;
visit[l]=visit[l^]=true;/*找到无向边拆成的另一条边*/
int v=edge[l].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[v],low[u]);
}
else low[u]=min(low[u],dfn[v]);/*多次返祖*/
}
}
void start()
{
for(int i=;i<=n;++i)
if(!dfn[i])
tarjan(i);
for(int i=;i<=n;++i)/*处理缩点以后的图*/
for(int l=head[i];l!=-;l=edge[l].last)
{
int v=edge[l].v;
if(low[i]!=low[v])
cnt[low[v]]++;
/*low[x]!=low[y]说明从low[y]回不到low[x],那么low[x]--low[y]是一条桥,因为tarjan中多次返祖*/
}
for(int i=;i<=n;++i)
if(cnt[i]==) ans++;/*统计度数是1的叶子节点的数目*/
printf("%d\n",(ans+)>>);
}
}G;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
G.init(n,m);
int x,y;
for(int i=;i<=m;++i)
{
scanf("%d%d",&x,&y);
G.add_edge(x,y);
G.add_edge(y,x);
}
G.start();
return ;
}

tarjan算法求桥双连通分量 POJ 3177 Redundant Paths的更多相关文章

  1. [双连通分量] POJ 3177 Redundant Paths

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13712   Accepted: 5821 ...

  2. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

    POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...

  3. POJ 3177 Redundant Paths (桥,边双连通分量,有重边)

    题意:给一个无向图,问需要补多少条边才可以让整个图变成[边双连通图],即任意两个点对之间的一条路径全垮掉,这两个点对仍可以通过其他路径而互通. 思路:POJ 3352的升级版,听说这个图会给重边.先看 ...

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

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

  5. POJ 3177 Redundant Paths(边双连通分量)

    [题目链接] http://poj.org/problem?id=3177 [题目大意] 给出一张图,问增加几条边,使得整张图构成双连通分量 [题解] 首先我们对图进行双连通分量缩点, 那么问题就转化 ...

  6. [学习笔记] Tarjan算法求桥和割点

    在之前的博客中我们已经介绍了如何用Tarjan算法求有向图中的强连通分量,而今天我们要谈的Tarjan求桥.割点,也是和上篇有博客有类似之处的. 关于桥和割点: 桥:在一个有向图中,如果删去一条边,而 ...

  7. POJ 3177 Redundant Paths (tarjan边双连通分量)

    题目连接:http://poj.org/problem?id=3177 题目大意是给定一些牧场,牧场和牧场之间可能存在道路相连,要求从一个牧场到另一个牧场要有至少两条以上不同的路径,且路径的每条pat ...

  8. poj 3177 Redundant Paths【求最少添加多少条边可以使图变成双连通图】【缩点后求入度为1的点个数】

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11047   Accepted: 4725 ...

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

随机推荐

  1. 变废为宝,将Discuz废弃的cache机制引入到memory体系中

    Discuz的source/class/cache目录,代表着相应的缓存机制,但实际上废弃很多年了. Discuz用Memory代表了缓存,里面内置了memcache等多种缓存驱动. 但很多人的开发环 ...

  2. linux shell 编程

    1,获取命令执行的结果,字符串拼接(脚本最常使用的功能)   cmd_result=$(date +%Y%b%d)        //使用变量获取命令执行的结果 或者 cmd_result=`date ...

  3. .NET Core Roadmap

    This post was written by Scott Hunter. It has been about two weeks since we shipped .NET Core / ASP. ...

  4. RCA端子颜色(红、白、黄)

    RCA端子(红白黄)的作用: 黄:视频 红:左声道 白:右声道 RCA为两口插头,红色代表左声道,白色为右声道,3.5(AUX口)同样为立体声接头,虽然它只有一个端口,同样也具有左右声道分开传输的功能 ...

  5. Android5.0新特性——阴影和剪裁(shadow)

    阴影和剪裁 View的z属性 Material Design建议为了凸显布局的层次,建议使用阴影效果,并且Android L为了简化大家的工作,对View进行了扩展,能使大家非常方便的创建阴影效果: ...

  6. django 中间件

    django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的.所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式 ...

  7. FEE Development Essentials

    FEE Development Essentials JS Basic function call() and apply() func1.bind(thisObj,arg1...argn) Cust ...

  8. 解决SQL Server 2008 64位系统无法导入Access/Excel的问题 2012/08/01

    操作系统Windows Server 2008 X64,数据库SQL Server 2008 X64,Office 2007(好像只有32位),在存储过程执行OpenDatasource导入Acces ...

  9. javascript宿主对象之window.navigator

    window.navigator用来反映浏览器及其功能信息的对象. // 检测浏览器版本信息 function getBrowserInfo(){ var Sys = {}; var ua = win ...

  10. 基础学习day06---面向对象二---static,类的初始化和调用顺序、单例模式

    一.static关键字 1.1.static关键字 静态:static用法:是一个修饰符,用于修饰成员(成员变量,成员函数)static 修饰的内容,所有对象共享当成员被静态修饰后,就多了一个调用方式 ...