Luogu2860 [USACO06JAN]冗余路径Redundant Paths

给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量

\(1\leq n\leq5000,\ n-1\leq m\leq10^4\)

tarjan


边双无疑不用考虑,于是就可以边双缩点成一棵树

令现在要连的边为 \((u,\ v)\) ,当前树上 \(bl_u\) 到 \(bl_v\) 的链将会变为一个新的点双,可以将他们看为一个新的点

可以贪心地连边使得每次连边后,不复存在的点尽量多,当只剩一个点时,原图就变成了一个双连通分量

如果 \(u\) 为非叶节点,显然不如将 \(u\) 子树中的一点 \(u'\) 与 \(v\) 连接,于是 \(u,\ v\) 均为叶节点

若 \(lca(u,\ v)\) 为 \(root\) ,将会消去两个叶节点,否则只会消去一个叶节点,因此每次选择 \(lca(u,\ v)\) 为 \(root\) 的两个点,答案即为 \(叶节点的个数\lfloor\frac{\verb|叶节点的个数|+1}{2}\rfloor\)

时间复杂度 \(O(n+m)\)

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define nc getchar()
  4. const int maxn = 5010;
  5. int n, m, tot, h[maxn], bl[maxn], dfn[maxn], low[maxn], deg[maxn]; bool vis[maxn], cut[maxn << 1];
  6. struct edges {
  7. int nxt, to;
  8. edges(int x = 0, int y = 0) : nxt(x), to(y) {}
  9. } e[maxn << 1];
  10. inline int read() {
  11. int x = 0; char c = nc;
  12. while (c < 48) c = nc;
  13. while (c > 47) x = x * 10 + c - 48, c = nc;
  14. return x;
  15. }
  16. void addline(int u, int v) {
  17. static int cnt = 1;
  18. e[++cnt] = edges(h[u], v), h[u] = cnt;
  19. }
  20. void tarjan(int u, int f) {
  21. static int now;
  22. dfn[u] = low[u] = ++now;
  23. for (int i = h[u]; i; i = e[i].nxt) {
  24. int v = e[i].to;
  25. if (!dfn[v]) {
  26. tarjan(v, u);
  27. low[u] = min(low[u], low[v]);
  28. if (dfn[u] < low[v]) cut[i] = cut[i ^ 1] = 1;
  29. } else if (v != f) {
  30. low[u] = min(low[u], dfn[v]);
  31. }
  32. }
  33. }
  34. void dfs(int u) {
  35. vis[u] = 1, bl[u] = tot;
  36. for (int i = h[u]; i; i = e[i].nxt) {
  37. int v = e[i].to;
  38. if (!cut[i] && !vis[v]) dfs(v);
  39. }
  40. }
  41. int main() {
  42. n = read(), m = read();
  43. for (int i = 1; i <= m; i++) {
  44. int u = read(), v = read();
  45. addline(u, v), addline(v, u);
  46. }
  47. tarjan(1, 0);
  48. for (int i = 1; i <= n; i++) {
  49. if (!vis[i]) tot++, dfs(i);
  50. }
  51. for (int u = 1; u <= n; u++) {
  52. for (int i = h[u]; i; i = e[i].nxt) {
  53. int v = e[i].to;
  54. if (bl[u] != bl[v]) deg[bl[v]]++;
  55. }
  56. }
  57. int ans = 0;
  58. for (int i = 1; i <= tot; i++) {
  59. ans += deg[i] == 1;
  60. }
  61. printf("%d", (ans + 1) >> 1);
  62. return 0;
  63. }

Luogu2860 [USACO06JAN]冗余路径Redundant Paths的更多相关文章

  1. 洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths 解题报告

    P2860 [USACO06JAN]冗余路径Redundant Paths 题目描述 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们 ...

  2. 缩点【洛谷P2860】 [USACO06JAN]冗余路径Redundant Paths

    P2860 [USACO06JAN]冗余路径Redundant Paths 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了 ...

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

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

  4. luogu P2860 [USACO06JAN]冗余路径Redundant Paths

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

  5. 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths

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

  6. [USACO06JAN] 冗余路径 Redundant Paths

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

  7. luogu P2860 [USACO06JAN]冗余路径Redundant Paths |Tarjan

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

  8. 【luogu P2860 [USACO06JAN]冗余路径Redundant Paths】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2860 考虑在无向图上缩点. 运用到边双.桥的知识. 缩点后统计度为1的点. 度为1是有一条路径,度为2是有两 ...

  9. (精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths

    (写题解不容易,来我的博客玩玩咯qwq~) 该题考察的知识点是边双连通分量 边双连通分量即一个无向图中,去掉一条边后仍互相连通的极大子图.(单独的一个点也可能是一个边双连通分量) 换言之,一个边双连通 ...

随机推荐

  1. box-sizing 的作用

    box-sizing:content-box | border-box content-box: padding和border不被包含在定义的width和height之内.对象的实际宽度等于设置的wi ...

  2. css3 简易时钟

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 微信小程序获取复选框全选,反选选中的值

    wxml文件 <view class="tr"> <view class="th"> <checkbox bindtap=&quo ...

  4. cf1139D. Steps to One(dp)

    题意 题目链接 从\([1, M]\)中随机选数,问使得所有数gcd=1的期望步数 Sol 一个很显然的思路是设\(f[i]\)表示当前数为\(i\),期望的操作轮数,转移的时候直接枚举gcd \(f ...

  5. How do I install Daydream on my phone?

    Google's philosophy with their newest VR platform is simple. In order to offer the best possible exp ...

  6. [Java]Socket和ServerSocket学习笔记

    对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求.这会,Socket对于我们来说就非常实用了.下面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSock ...

  7. recovery 升级前兼容性检查(Vendor Interface Object)

    从android P(9.0)版本开始,我们发现编译出来的OTA升级了里面多了一个文件,compatibility.zip,这个里面存储这system与vendor分区的一些特性,用来做升级前的兼容性 ...

  8. mongodb安装失败与解决方法(附安装教程)

    安装mongodb遇到的一些坑 浪费了大量的时间 在此记录一下   主要是电脑系统win10企业版自带的防火墙  当然还有其他的一些坑 一般的问题在第6步骤都可以解决,本教程的安装步骤不够详细的话  ...

  9. Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器

    一.开发环境 Nginx地址:  http://nginx.org/download/nginx-1.14.2.tar.gz Nginx-rtmp-module地址: https://github.c ...

  10. spring4笔记----使用装配注入合作者Bean的三种方式

    no :不自动装配 byName :id(name)与setter方法去set前缀,并小写首字母后同名的Bean完成注入,如有多个匹配则抛异常 byType :spring容器找全部bean,如果找到 ...