Redundant Paths
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 15752   Accepted: 6609

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
注意重边
不能通过low值判断两个点在一个连通分量内,
因为这样的数据 1-6都在一个联通块内,但6的low值和其他不同。
6 7
1 2
2 3
3 4
4 6
6 2
4 5
5 1
但是貌似 没有影响?。因为虽然6的low值有变化,但是他不可能是叶节点,所以用low值水过去也是可以的吧 就是缩点后找叶子结点的数目+1/2就是答案
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
bool mp[N][N];
int head[N],dfn[N],low[N],cont[N];
int tot,cnt;
struct node{
int next,to;
}e[N<<];
void add(int u,int v){
e[tot].to=v;e[tot].next=head[u];head[u]=tot++;
e[tot].to=u;e[tot].next=head[v];head[v]=tot++;
}
void Tajan(int u,int fa){
dfn[u]=low[u]=++cnt;
for(int i=head[u];i+;i=e[i].next){
int v=e[i].to;
if(v==fa) continue;
if(!dfn[v]) {
Tajan(v,u);
low[u]=min(low[v],low[u]);
}
else low[u]=min(low[u],dfn[v]);
}
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
int u,v;
memset(head,-,sizeof(head));
memset(mp,,sizeof(mp));
memset(cont,,sizeof(cont));
tot=cnt=;
while(m--){
scanf("%d%d",&u,&v);
if(mp[u][v]) continue;
add(u,v);
mp[u][v]=mp[v][u]=;
}
Tajan(,);
for(int i=;i<=n;++i)
for(int j=head[i];j+;j=e[j].next){
int v=e[j].to;
if(low[v]!=low[i])
++cont[low[i]];
}
int ans=;
for(int i=;i<=n;++i)
if(cont[i]==) ++ans;
printf("%d\n",(ans+)/);
}
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
bool mp[N][N];
int head[N],dfn[N],low[N],cont[N],bl[N],q[N];
int tot,cnt,scnt,l;
struct node{
   int next,to;
}e[N<<];
void add(int u,int v){
   e[tot].to=v;e[tot].next=head[u];head[u]=tot++;
   e[tot].to=u;e[tot].next=head[v];head[v]=tot++;
}
void Tajan(int u,int fa){
    q[l++]=u;
   dfn[u]=low[u]=++cnt;
   for(int i=head[u];i+;i=e[i].next){
    int v=e[i].to;
    if(v==fa) continue;
    if(!dfn[v]) {
        Tajan(v,u);
        low[u]=min(low[v],low[u]);
    }
    else low[u]=min(low[u],dfn[v]);
   }
   if(dfn[u]==low[u]){
    int t;
    ++scnt;
    do{
        t=q[--l];
        bl[t]=scnt;
    }while(t!=u);
   }
}
int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
        int u,v;
        memset(head,-,sizeof(head));
        memset(mp,,sizeof(mp));
        memset(cont,,sizeof(cont));
        l=scnt=tot=cnt=;
        while(m--){
            scanf("%d%d",&u,&v);
            if(mp[u][v]) continue;
            add(u,v);
            mp[u][v]=mp[v][u]=;
        }
        Tajan(,);
        for(int i=;i<=n;++i)
        for(int j=head[i];j+;j=e[j].next){
            int v=e[j].to;
            if(bl[v]!=bl[i])
                ++cont[bl[i]];
        }
        int ans=;
        for(int i=;i<=n;++i)
            if(cont[i]==) ++ans;
            printf("%d\n",(ans+)/);
    }
}

poj3177 无向连通图加多少条边变成边双连通图的更多相关文章

  1. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

  2. ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug

    ASP无惧上传类不能上传中文双引号文件及ASP函数InStr存在bug 近日发现eWebEditor V2.8 asp 版本上传文件文件名不能包含中文双引号,发现eWebEditor使用ASP“无惧上 ...

  3. 采用formdata做跨域的、无刷新、带进度条的文件上传

    以前做无刷新上传,都要用iframe,如果想有进度条,就千难万难,不得不用flash等插件来实现. 现在HTML5终于普及了,筒子们不用再那么痛苦了. 所有这一切都变得异常简单!! 不信?且看如下代码 ...

  4. spin.js无图片实现loading进度条,支持但非依赖jquery

    特点: 1.无图片,无外部CSS 2.无依赖(支持jQuery,但非必须) 3.高度可配置 4.分辨率无关 5.旧版本IE不支持时,采用VML支持 6.使用关键帧动画,采用setTimeout() 7 ...

  5. nyoj42——连通图加欧拉(连通图板子)dfs

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  6. Hive 组内计无重复数,追加每条记录后面

    今天无意中碰到一个很简单的计算逻辑,但是用hive想了一大会才实现. 示例表数据: 需求逻辑: 给每条记录追加一个字段,用于统计按照p1和p2字段分组后,每个组中的num的数目(去重后的count). ...

  7. 无图无定位新版css步骤条兼容ie6+

    <ul class="ui-step list-unstyled"> <li class="step-item"><b class ...

  8. POJ3177,/3352.求最少添加多少边使无向图边双连通

    俩个题一样.tarjan算法应用,开始求桥,WA,同一个边双连通分量中low值未必都相同,不能用此来缩点.后来用并查集来判断,若不是桥,则在一个双连通分量中,并之,后边再查,将同一个双连通分量中的点通 ...

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

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

随机推荐

  1. HDU 2513 Cake slicing

    #include<bits/stdc++.h> using namespace std; int n,m,k; int cherry[405],dp[405][405]; int solv ...

  2. HDU 5954 Do Not Pour Out

    #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...

  3. Robot Framework -002 在Windows10上的安装

    机器人框架是使用Python实现的,并且还支持Jython(JVM),IronPython(.NET)和PyPy. 在安装框架之前,一个明显的前提条件是至少安装这些解释器之一. 下面列出了安装Robo ...

  4. NumPy学习指南(第2版)

    第一章 NumPy快速入门 首先,我们将介绍如何在不同的操作系统中安装NumPy和相关软件,并给出使用NumPy的简单示例代码. 然后,我们将简单介绍IPython(一种交互式shell工具). 如前 ...

  5. Redis(四):独立功能的实现

    发布与订阅 Redis 的发布与订阅功能有PUBLISH命令,SUBSCRIBE命令,PSUBSCRIBE命令,PUBSUB命令等组成. 客户端可以通过SUBSCRIBE命令订阅一个或多个频道,当其它 ...

  6. 你所不知道的Python | 字符串连接的秘密

    字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在Python中,我们可以用多种方式实现字符串的连接,稍有不慎就有可能因为选择不当而给程序带来性能损失. 方 ...

  7. 通过fiddler抓取IDEA的请求

    2019独角兽企业重金招聘Python工程师标准>>> 因为fiddler默认是代理的8888端口,所以设置一下IDEA的请求使用本地的8888作为代理发出. 1."EDI ...

  8. Clickhouse 字符串拆分 OR 一行转多行

    Clickhouse 字符串拆分 OR 一行转多行 我想把 '123_456_142354_23543' 通过'_' 下划线进行拆分成

  9. 【摘抄】深入解析Windows操作系统

    一.线程是一个进程内部的实体,也是Windows执行此进程时的调度实体.若没有线程,进程的程序将不可能运行.线程包含以下部件: 1.一组代表处理器状态的CPU寄存器中的内容. 2.两个栈:一个用于线程 ...

  10. MySQL导出数据到文件中的方法

    MySQL导出数据到文件中的方法 1.导出数据到txt文件中实例:把数据表studscoreinfo中所有数据导出到指定的位置方法:select * from 表名 into outfile 指定导出 ...