题意:给一个无向图,问最少添加多少条边后能使整个图变成双连通分量。

思路:双连通分量缩点,缩点后给度为1的分量两两之间连边,要连(ans+1) div 2条

low[u]即为u所在的分量编号,flag=0,1,2表示没搜过,没搜完,搜完了

POJ上pascal编译器出问题了不管怎么交都CE

这次写的 应该能处理重边

  1. var head,vet,next,flag,dfn,low,fan,de:array[..]of longint;
  2. n,m,i,e,v,ans,x,y,tot,time:longint;
  3.  
  4. procedure add(a,b:longint);
  5. begin
  6. inc(tot);
  7. next[tot]:=head[a];
  8. vet[tot]:=b;
  9. head[a]:=tot;
  10. end;
  11.  
  12. function min(x,y:longint):longint;
  13. begin
  14. if x<y then exit(x);
  15. exit(y);
  16. end;
  17.  
  18. procedure dfs(u,le:longint);
  19. var e,v:longint;
  20. begin
  21. flag[u]:=;
  22. inc(time); dfn[u]:=time; low[u]:=time;
  23. e:=head[u];
  24. while e<> do
  25. begin
  26. v:=vet[e];
  27. if e=fan[le] then
  28. begin
  29. e:=next[e];
  30. continue;
  31. end;
  32. if flag[v]= then
  33. begin
  34. dfs(v,e);
  35. low[u]:=min(low[u],low[v]);
  36. end
  37. else if flag[v]= then low[u]:=min(low[u],dfn[v]);
  38. e:=next[e];
  39. end;
  40. flag[u]:=;
  41. end;
  42.  
  43. begin
  44.  
  45. for i:= to do
  46. if i mod = then fan[i]:=i+
  47. else fan[i]:=i-;
  48. while not eof do
  49. begin
  50. readln(n,m);
  51. if (n=)and(m=) then break;
  52. fillchar(head,sizeof(head),);
  53. fillchar(low,sizeof(low),);
  54. fillchar(de,sizeof(de),);
  55. fillchar(flag,sizeof(flag),);
  56. tot:=; time:=;
  57. for i:= to m do
  58. begin
  59. read(x,y);
  60. add(x,y);
  61. add(y,x);
  62. end;
  63. for i:= to n do
  64. if flag[i]= then dfs(i,);
  65. for i:= to n do
  66. begin
  67. e:=head[i];
  68. while e<> do
  69. begin
  70. v:=vet[e];
  71. if low[v]<>low[i] then inc(de[low[i]]);
  72. e:=next[e];
  73. end;
  74. end;
  75. ans:=;
  76. for i:= to n do
  77. if de[i]= then inc(ans);
  78. writeln((ans+) div );
  79. end;
  80.  
  81. end.

这个是去年写的那时候AC了 好像不能处理重边

  1. var de,low,next,vet,head,flag,dfn:array[..]of longint;
  2. n,m,tot,x,y,i,e,v,leaf,time:longint;
  3.  
  4. function min(x,y:longint):longint;
  5. begin
  6. if x<y then exit(X);
  7. exit(y);
  8. end;
  9.  
  10. procedure add(a,b:longint);
  11. begin
  12. inc(tot);
  13. next[tot]:=head[a];
  14. vet[tot]:=b;
  15. head[a]:=tot;
  16. end;
  17.  
  18. procedure dfs(u,fa:longint);
  19. var e,v:longint;
  20. begin
  21. inc(time);
  22. dfn[u]:=time; low[u]:=time;
  23. flag[u]:=;
  24. e:=head[u];
  25. while e<> do
  26. begin
  27. v:=vet[e];
  28. if v=fa then
  29. begin
  30. e:=next[e];
  31. continue;
  32. end;
  33. if flag[v]= then
  34. begin
  35. dfs(v,u);
  36. low[u]:=min(low[u],low[v]);
  37. end
  38. else if flag[v]= then low[u]:=min(low[u],dfn[v]);
  39. e:=next[e];
  40. end;
  41. flag[u]:=;
  42. end;
  43.  
  44. begin
  45.  
  46. while not eof do
  47. begin
  48. readln(n,m);
  49. if (n=)and(m=) then break;
  50. fillchar(head,sizeof(head),);
  51. tot:=;
  52. for i:= to m do
  53. begin
  54. readln(x,y);
  55. add(x,y);
  56. add(y,x);
  57. end;
  58. fillchar(dfn,sizeof(dfn),);
  59. fillchar(de,sizeof(de),);
  60. fillchar(flag,sizeof(flag),);
  61. time:=;
  62. for i:= to n do
  63. if flag[i]= then dfs(i,i);
  64. for i:= to n do
  65. begin
  66. e:=head[i];
  67. while e<> do
  68. begin
  69. v:=vet[e];
  70. if low[i]<>low[v] then inc(de[low[i]]);
  71. e:=next[e];
  72. end;
  73. end;
  74. leaf:=;
  75. for i:= to n do
  76. if de[i]= then inc(leaf);
  77. writeln((leaf+) div );
  78. end;
  79.  
  80. end.

UPD(2018.10.18):C++

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<string>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<vector>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned int uint;
  14. typedef unsigned long long ull;
  15. typedef pair<int,int> PII;
  16. typedef vector<int> VI;
  17. #define fi first
  18. #define se second
  19. #define MP make_pair
  20. #define N 15000
  21. #define M 6100000
  22. #define eps 1e-8
  23. #define pi acos(-1)
  24. #define oo 1e9
  25.  
  26. int head[N],vet[N],nxt[N],flag[N],dfn[N],low[N],fan[N],d[N],
  27. tot,tim;
  28.  
  29. void add(int a,int b)
  30. {
  31. nxt[++tot]=head[a];
  32. vet[tot]=b;
  33. head[a]=tot;
  34. }
  35.  
  36. void dfs(int u,int le)
  37. {
  38. flag[u]=;
  39. dfn[u]=low[u]=++tim;
  40. int e=head[u];
  41. while(e)
  42. {
  43. int v=vet[e];
  44. if(e==fan[le])
  45. {
  46. e=nxt[e];
  47. continue;
  48. }
  49. if(!flag[v])
  50. {
  51. dfs(v,e);
  52. low[u]=min(low[u],low[v]);
  53. }
  54. else if(flag[v]==) low[u]=min(low[u],dfn[v]);
  55. e=nxt[e];
  56. }
  57. flag[u]=;
  58. }
  59.  
  60. int main()
  61. {
  62. freopen("poj3352.in","r",stdin);
  63. freopen("poj3352.out","w",stdout);
  64. for(int i=;i<=;i++)
  65. if(i&) fan[i]=i+;
  66. else fan[i]=i-;
  67. int n,m;
  68. while(scanf("%d%d",&n,&m)!=EOF)
  69. {
  70. memset(head,,sizeof(head));
  71. memset(low,,sizeof(low));
  72. memset(d,,sizeof(d));
  73. memset(flag,,sizeof(flag));
  74. tot=tim=;
  75. for(int i=;i<=m;i++)
  76. {
  77. int x,y;
  78. scanf("%d%d",&x,&y);
  79. add(x,y);
  80. add(y,x);
  81. }
  82. for(int i=;i<=n;i++)
  83. if(flag[i]==) dfs(i,);
  84. for(int i=;i<=n;i++)
  85. {
  86. int e=head[i];
  87. while(e)
  88. {
  89. int v=vet[e];
  90. if(low[v]!=low[i]) d[low[i]]++;
  91. e=nxt[e];
  92. }
  93. }
  94. int ans=;
  95. for(int i=;i<=n;i++)
  96. if(d[i]==) ans++;
  97. printf("%d\n",(ans+)/);
  98. }
  99. return ;
  100. }

【POJ3352】Road Construction(边双联通分量)的更多相关文章

  1. [POJ3352]Road Construction

    [POJ3352]Road Construction 试题描述 It's almost summer time, and that means that it's almost summer cons ...

  2. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

  3. POJ 3352 Road Construction (边双连通分量)

    题目链接 题意 :有一个景点要修路,但是有些景点只有一条路可达,若是修路的话则有些景点就到不了,所以要临时搭一些路,以保证无论哪条路在修都能让游客到达任何一个景点 思路 :把景点看成点,路看成边,看要 ...

  4. 【UVA10972】RevolC FaeLoN (求边双联通分量)

    题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...

  5. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  6. HDU5409---CRB and Graph 2015多校 双联通分量缩点

    题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...

  7. poj2942(双联通分量,交叉染色判二分图)

    题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...

  8. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  9. 大白书中无向图的点双联通分量(BCC)模板的分析与理解

    对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. ...

  10. 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

随机推荐

  1. 【转】Windows 邮件槽(MailSlot)

    Windows 邮件槽(MailSlot) 来自<Windows网络编程第二版 中文版> 优点:通过网络,将一条消息广播给一台或多台计算机.   缺点:只允许从客户机到服务器,建立一种不可 ...

  2. 【转】关于“using namespace std”

    对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std.这句话其实就表示了所有的标准库函数都 ...

  3. Noip 训练指南

    目录 Noip 训练指南 图论 数据结构 位运算 期望 题解 Noip 训练指南 目前完成 \(4 / 72\) 图论 [ ] 跳楼机 [ ] 墨墨的等式 [ ] 最优贸易 [ ] 泥泞的道路 [ ] ...

  4. mysql 添加数据如果数据存在就更新ON DUPLICATE KEY UPDATE和REPLACE INTO

    #下面建立game表,设置name值为唯一索引. CREATE TABLE `game` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar( ...

  5. Unity基础-发布

    PC BuildSetting File->BuildSetting Switch Platform Development Build是在调试模式下使用版本 Script Debugging调 ...

  6. python入门:while 循环的基本用法

    #!/usr/bin/env python # -*- coding:utf-8 -*- #while 循环的作用 import time while True: ") time.sleep ...

  7. 【mysql】【转发】my.cnf 讲解

    PS:本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS 5.6 64位系统,MySQL 5.5.x 稳定版.适用于日IP 50-100w,PV 100-300w的 ...

  8. ProC第二弹

    一.提要 上文简单介绍了Windows下ProC配置开发,这次我们使用Linux平台再次配置Oracle ProC开发环境(RedHat Linux 9 + Oracle 92).    <OR ...

  9. 排序 sort函数

    sort函数见下表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partia ...

  10. NPM包的安装及卸载

    NPM全名:node package manager,是node包管理工具,负责安装.卸载.更新等.新版的NodeJS已经集成了npm.所以装好NodeJS的同时,npm也已经装好了! 可以用cmd命 ...