1、给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图。

2、

3、

  1. //边双连通分支
  2. /*
  3. 去掉桥,其余的连通分支就是边双连通分支了。一个有桥的连通图要变成边双连通图的话,
  4. 把双连通子图收缩为一个点,形成一颗树。需要加的边为(leaf+1)/2(leaf为叶子结点的个数)
  5. POJ 3177 给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图。
  6. */
  7. #include<iostream>
  8. #include<stdio.h>
  9. #include<string.h>
  10. using namespace std;
  11.  
  12. const int MAXN=;//点数
  13. const int MAXM=;//边数,因为是无向图,所以这个值要 *2
  14. struct Edge{
  15. int to,next;
  16. bool cut;//是否是桥标记
  17. }edge[MAXM];
  18. int head[MAXN],tot;
  19. int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong 数组的值是1~block
  20. int Index,top;
  21. int block;//边双连通块数
  22. bool Instack[MAXN];
  23. int bridge;//桥的数目
  24. void addedge(int u,int v){
  25. edge[tot].to=v;
  26. edge[tot].next=head[u];
  27. edge[tot].cut=false;
  28. head[u]=tot++;
  29. }
  30. void Tarjan(int u,int pre){
  31. int v;
  32. Low[u]=DFN[u]=++Index;
  33. Stack[top++]=u;
  34. Instack[u]=true;
  35. for(int i=head[u];i!=-;i=edge[i].next){
  36. v=edge[i].to;
  37. if(v==pre)continue;
  38. if(!DFN[v]){
  39. Tarjan(v,u);
  40. if(Low[u]>Low[v])Low[u]=Low[v];
  41. if(Low[v]>DFN[u]){
  42. bridge++;
  43. edge[i].cut=true;
  44. edge[i^].cut=true;
  45. }
  46. }
  47. else if(Instack[v]&&Low[u]>DFN[v])
  48. Low[u]=DFN[v];
  49. }
  50. if(Low[u]==DFN[u]){
  51. block++;
  52. do{
  53. v=Stack[--top];
  54. Instack[v]=false;
  55. Belong[v]=block;
  56. }
  57. while(v!=u);
  58. }
  59. }
  60. void init(){
  61. tot=;
  62. memset(head,-,sizeof(head));
  63. }
  64. int du[MAXN];//缩点后形成树,每个点的度数
  65. void solve(int n){
  66. memset(DFN,,sizeof(DFN));
  67. memset(Instack,false,sizeof(Instack));
  68. Index=top=block=;
  69. Tarjan(,);
  70. int ans=;
  71. memset(du,,sizeof(du));
  72. for(int i=;i<=n;i++)
  73. for(int j=head[i];j!=-;j=edge[j].next)
  74. if(edge[j].cut)
  75. du[Belong[i]]++;
  76. for(int i=;i<=block;i++)
  77. if(du[i]==)
  78. ans++;
  79. //找叶子结点的个数 ans,构造边双连通图需要加边(ans+1)/2
  80. printf("%d\n",(ans+)/);
  81. }
  82. int main(){
  83. int n,m;
  84. int u,v;
  85. while(scanf("%d%d",&n,&m)==){
  86. init();
  87. while(m--){
  88. scanf("%d%d",&u,&v);
  89. addedge(u,v);
  90. addedge(v,u);
  91. }
  92. solve(n);
  93. }
  94. return ;
  95. }

POJ - 3177 Redundant Paths(边双连通分支)(模板)的更多相关文章

  1. Poj 3177 Redundant Paths (双连通分支+节点统计)

    题目描述: 给出一个无向的连通图,问最少加入几条边,才能使所给的图变为无桥的双连通图? 解题思路: 可以求出原图中所有的不包含桥的所有最大连通子图,然后对连通子图进行标记缩点,统计度为1的叶子节点le ...

  2. tarjan算法求桥双连通分量 POJ 3177 Redundant Paths

    POJ 3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12598   Accept ...

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

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

  4. POJ 3177 Redundant Paths(边双连通的构造)

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13717   Accepted: 5824 ...

  5. POJ 3177——Redundant Paths——————【加边形成边双连通图】

    Redundant Paths Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  6. POJ 3177 Redundant Paths POJ 3352 Road Construction

    这两题是一样的,代码完全一样. 就是给了一个连通图,问加多少条边可以变成边双连通. 去掉桥,其余的连通分支就是边双连通分支了.一个有桥的连通图要变成边双连通图的话,把双连通子图收缩为一个点,形成一颗树 ...

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

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

  8. poj 3177 Redundant Paths

    题目链接:http://poj.org/problem?id=3177 边双连通问题,与点双连通还是有区别的!!! 题意是给你一个图(本来是连通的),问你需要加多少边,使任意两点间,都有两条边不重复的 ...

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

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

随机推荐

  1. HDU 5421 Victor and String

    Victor and String Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on HDU. Orig ...

  2. php基础 数组 遍历

    //参数默认值// function abc($a,$b,$c=0){// echo $a,$b,$c;// }// abc(1,3); //可变参数//function def(){// $arr= ...

  3. 【Ajax 4】Ajax、JavaScript和JQuery的联系和区别

    导读:在之前,就分别学习了Ajax.JavaScript和JQuery,然后对于这三者之间的关系,是一直云里雾里的.尤其是后来学到了Ajax,就更是不明白了.现在,就给总结总结. 一.基本概述 1.1 ...

  4. C#通信学习(一)

    基础知识 TCP/IP:Transmission Control Protocol/Internet Protocol,传输控制协议/因特网互联协议,又名网络通讯协议.简单来说:TCP控制传输数据,负 ...

  5. POJ-1861,Network,最小生成树水题,,注意题面输出有问题,不必理会~~

    Network Time Limit: 1000MS   Memory Limit: 30000K          Special Judge http://poj.org/problem?id=1 ...

  6. github新建本地仓库,再同步远程仓库基本用法

    github新建本地仓库,再同步远程仓库基本用法 1 mkdir gitRepo 2 cd gitRepo 3 git init  #初始化本地仓库 4 git add xxx  #添加要push到远 ...

  7. BZOJ1744: [Usaco2005 oct]Skiing 奶牛滑雪

    n<=100 * m<=100的地图,每个数绝对值不超过25,从1,1到n,m,一开始速度v,从数字A走到数字B速度会变成v*2^(A-B),求到终点最短时间. 可以发现,相同的数字出发的 ...

  8. ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路

    https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...

  9. C. The Two Routes---cf602C(Dij)

    http://codeforces.com/problemset/problem/602/C 题目大意:  有n个城市 有m条铁路  如果两个城市没有铁路  那么一定有公路 求从1 到 n 用铁路和公 ...

  10. topcoder 649 DIV2

    8 A:模拟 9:B:终于看懂题目... 题意:最多分解K次 每分钟一个数可以分解成两个数 或者-1: 关键字:DP,记忆花搜索. DP[I][J]=min(dp[i][j],1+max(dp[ii] ...