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. python 的import机制2

    http://blog.csdn.net/sirodeng/article/details/17095591   python 的import机制,以备忘: python中,每个py文件被称之为模块, ...

  2. AppCan可以视为Rexsee的存活版

    今天看到地宝的几个APP用appcan做的,我顿时惊呆了. 1. 走的同样是中间件的模式,支持原生UI界面的访问: 2. 在线打包的方式,进行资源的限制,以便商业化支持:

  3. platform总线globalfifo驱动

    功能是使用内存的4k单元,实现读,写,偏移,清除. /************************************************************************* ...

  4. [moka同学笔记]bootstrap基础

    1.导航栏的制作 <nav class="nav navbar-default navbar-fixed-top" role="navigation"&g ...

  5. Office 365 - SharePoint Tips & Tricks

    1. Recycle Bin 地址: //管理员 /_layouts/15/AdminRecycleBin.aspx //普通用户 /_layouts/15/RecycleBin.aspx 2.

  6. SharePoint 2010 文档管理系列之准备篇

    前言:很早自己就想写一个系列的文章,但是不知道写什么,最近在QQ群里,好多人说在做文档管理,其实文档管理也是SharePoint的一个很不错的功能点,自己想了想,也想多学习点东西,所以写这个主题吧,今 ...

  7. Python学习三---序列、列表、元组

    一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. ...

  8. 深入理解Android的startservice和bindservice

    一.首先,让我们确认下什么是service?         service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比 ...

  9. 朝花夕拾-android 获取当前手机的内存卡状态和网络连接状态

    序言: 人的一生是一个选择的过程. 如果脚下只有一条路,只要一往无前即可,不用担心走错.即使是错也别无它法.然而人是不安分的,况且安于独木桥的行走,其目的地由于没有蜿蜒曲折去遮挡行路人的视线,一往无前 ...

  10. iOS之 Mac下抓包工具使用wireshark

    主要是mac上面网卡的授权 分三个步骤:    1.wireshark安装        wireshark运行需要mac上安装X11,mac 10.8的系统上默认是没有X11的.先去http://x ...