LINK


题目大意

给你一个有重边的无向图图,问你最少连接多少条边可以使得整个图双联通

思路

就是个边双的模板

注意判重边的时候只对父亲节点需要考虑

你就dfs的时候记录一下出现了多少条连向父亲的边就可以了

然后和有向图不一样的是,在这里非树边的更新不用判断点是不是在栈内,因为无向图中没有u可以到达v但是v不能到达u的情况


  1. //Author: dream_maker
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<stack>
  7. using namespace std;
  8. //----------------------------------------------
  9. //typename
  10. typedef long long ll;
  11. //convenient for
  12. #define fu(a, b, c) for (int a = b; a <= c; ++a)
  13. #define fd(a, b, c) for (int a = b; a >= c; --a)
  14. #define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
  15. //inf of different typename
  16. const int INF_of_int = 1e9;
  17. const ll INF_of_ll = 1e18;
  18. //fast read and write
  19. template <typename T>
  20. void Read(T &x) {
  21. bool w = 1;x = 0;
  22. char c = getchar();
  23. while (!isdigit(c) && c != '-') c = getchar();
  24. if (c == '-') w = 0, c = getchar();
  25. while (isdigit(c)) {
  26. x = (x<<1) + (x<<3) + c -'0';
  27. c = getchar();
  28. }
  29. if (!w) x = -x;
  30. }
  31. template <typename T>
  32. void Write(T x) {
  33. if (x < 0) {
  34. putchar('-');
  35. x = -x;
  36. }
  37. if (x > 9) Write(x / 10);
  38. putchar(x % 10 + '0');
  39. }
  40. //----------------------------------------------
  41. const int N = 5e3 + 10;
  42. const int M = 1e4 + 10;
  43. struct Edge {
  44. int u, v, nxt;
  45. } E[M << 1];
  46. int head[N], tot = 0;
  47. int n, m, du[N];
  48. void add(int u, int v) {
  49. ++tot;
  50. E[tot].u = u;
  51. E[tot].v = v;
  52. E[tot].nxt = head[u];
  53. head[u] = tot;
  54. }
  55. int dfn[N], low[N], bel[N], ind = 0, cnt_bcc = 0;
  56. stack<int> st;
  57. void tarjan(int u, int fa) {
  58. dfn[u] = low[u] = ++ind;
  59. st.push(u);
  60. bool k = 0;
  61. for (int i = head[u]; i; i = E[i].nxt) {
  62. int v = E[i].v;
  63. if (fa == v && !k) {
  64. k = 1;
  65. continue;
  66. }
  67. if (!dfn[v]) {
  68. tarjan(v, u);
  69. low[u] = min(low[u], low[v]);
  70. } else {
  71. low[u] = min(low[u], dfn[v]);
  72. }
  73. }
  74. if (low[u] == dfn[u]) {
  75. int now;
  76. ++cnt_bcc;
  77. do {
  78. now = st.top(); st.pop();
  79. bel[now] = cnt_bcc;
  80. } while (now != u);
  81. }
  82. }
  83. int main() {
  84. Read(n), Read(m);
  85. fu(i, 1, m) {
  86. int u, v;
  87. Read(u), Read(v);
  88. add(u, v);
  89. add(v, u);
  90. }
  91. fu(i, 1, n) if (!dfn[i]) tarjan(i, 0);
  92. for (int i = 1; i <= tot; i += 2) {
  93. int u = E[i].u, v = E[i].v;
  94. if (bel[u] != bel[v]) {
  95. du[bel[u]]++;
  96. du[bel[v]]++;
  97. }
  98. }
  99. int ans = 0;
  100. fu(i, 1, cnt_bcc)
  101. if (du[i] == 1) ans++;
  102. ans = (ans + 1) >> 1;
  103. Write(ans);
  104. return 0;
  105. }

POJ3177 Redundant Paths【tarjan边双联通分量】的更多相关文章

  1. POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】

    LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...

  2. [J]computer network tarjan边双联通分量+树的直径

    https://odzkskevi.qnssl.com/b660f16d70db1969261cd8b11235ec99?v=1537580031 [2012-2013 ACM Central Reg ...

  3. POJ 3177 Redundant Paths 无向图边双联通基础题

    题意: 给一个无向图,保证任意两个点之间有两条完全不相同的路径 求至少加多少边才能实现 题解: 得先学会一波tarjan无向图 桥的定义是:删除这条边之后该图不联通 一条无向边(u,v)是桥,当且仅当 ...

  4. POJ 3694Network(Tarjan边双联通分量 + 缩点 + LCA并查集维护)

    [题意]: 有N个结点M条边的图,有Q次操作,每次操作在点x, y之间加一条边,加完E(x, y)后还有几个桥(割边),每次操作会累积,影响下一次操作. [思路]: 先用Tarjan求出一开始总的桥的 ...

  5. BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树

    题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...

  6. poj-3177(并查集+双联通分量+Tarjan算法)

    题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集 ...

  7. tarjan求双联通分量(割点,割边)

    之前一直对tarjan算法的这几种不同应用比较混淆...我太弱啦! 被BLO暴虐滚过来 用tarjan求点双,很多神犇都给出了比较详细的解释和证明,在这里就不讲了(其实是这只蒟蒻根本不会orz) 这里 ...

  8. POJ3177 Redundant Paths(边双连通分量+缩点)

    题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径. 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是 ...

  9. poj3352 Road Construction & poj3177 Redundant Paths (边双连通分量)题解

    题意:有n个点,m条路,问你最少加几条边,让整个图变成边双连通分量. 思路:缩点后变成一颗树,最少加边 = (度为1的点 + 1)/ 2.3177有重边,如果出现重边,用并查集合并两个端点所在的缩点后 ...

随机推荐

  1. C++ string 类

    标准c++中string类函数介绍 注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为 ...

  2. WordPress配置

    1.准备工作: 下载comsenzexp.exe 下载wordpress.zip 2.安装comsenzexp.exe,安装有个wwwroot目录: 3.解压wordpress.zip,然后ctrl+ ...

  3. 尚未指定报表“Report1”的报表定义

    在做RDLC项目中遇到这样的错误 本地报表处理期间出错. 尚未指定报表“Report1”的报表定义 未将对象引用设置到对象的实例. 解决方案: 打开reportViewer->LocalRepo ...

  4. JSDoc 注释规范

    命令名描述 @param @argument 指定参数名和说明来描述一个函数参数@returns 描述函数的返回值@author 指示代码的作者@deprecated 指示一个函数已经废弃,而且在将来 ...

  5. this指向 - 开端

    /* 这个主题 主要是为了论述 js 中一个最烦人的问题 --> this 的指向问题 其实,这个 this 到底指向什么,指向谁,查了好多资料.书籍.官文,也没有给出明确的一个结论, 也学这也 ...

  6. 使用vux实现上拉刷新的总结

    最近公司在研发app,选择了基于Vue框架的vux组件库,现总结在实现上拉刷新功能遇到的坑: 1.问题:只刷新一次,解决方法:需要自己手动重置状态 this.scrollerStatus.pullup ...

  7. MySQL备份与恢复-mysqldump备份与恢复

    这片博文主要用来介绍MySQL的备份与恢复: MySQL的备份形式可以分为如下几种: 热备----即不停机备份 冷备----需要关闭MySQL,然后备份其数据文件.(停机备份一般是直接拷贝其datad ...

  8. 2018-2019-1 20189218《Linux内核原理与分析》第三周作业

    mykernel 实验 实验楼里按步骤运行一切顺利,make等待的时间特别久: 但是,启动mykernel后,实验楼的界面就不响应了,所以还是在自己虚拟机上做这个实验. 虚拟机搭建 mykernel ...

  9. linux下 ip指令

    目录 Network ip command Command :ip 简介 内容 Network ip command Command :ip 简介 ip 是個指令喔!並不是那個 TCP/IP 的 IP ...

  10. Ubuntu18.04 怎么开热点

    先说明,电脑上要有wifi适配器,而且连接wifi时,不能开热点 我的笔记本是双系统,现在介绍一下我的设置 在设置里打开热点这个应该会吧,但是热点密码不是自己设置的,而是随机生成的,本文重点介绍一下怎 ...