\(\Huge{割点}\)

  • \(无向图割点判定法则\)

    当遍历到一个点x时,这个点为割点的情况有两种:

    • 第一种是该节点为根节点且子节点数>=2,必导致两个子节点不连通;
    • 第二种是该节点不为根节点,且 \(low[i]>=dfn[x]\),即子节点i可回溯到的最早的点不早于x点,那么删去x一定导致x的子节点不连通;
    • 反之,若 \(low[i]<dfn[x]\),则说明i能绕行到比x更早的点,则x不是割点;(即环内的点割不掉);

  1. //无向图割点模板
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #define endl '\n'
  5. #define N 20001
  6. using namespace std;
  7. template<typename Tp> inline void read(Tp&x)
  8. {
  9. x=0;register bool f=1;
  10. register char c=getchar();
  11. for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=0;
  12. for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
  13. x=(f?x:~x+1);
  14. }
  15. int n,m,a,b,tot,root,ans,dfn[N],low[N];
  16. bool cut[N];
  17. vector<int> e[N];
  18. void tarjan(int x)
  19. {
  20. dfn[x]=low[x]=++tot;
  21. int child=0;
  22. for(int y:e[x])
  23. if(!dfn[y])
  24. {
  25. tarjan(y),
  26. low[x]=min(low[x],low[y]);
  27. if(low[y]>=dfn[x])
  28. {
  29. child++;
  30. if(x!=root||child>1) cut[x]=1;
  31. }
  32. }
  33. else low[x]=min(low[x],dfn[y]);
  34. }
  35. signed main()
  36. {
  37. #ifndef ONLINE_JUDGE
  38. freopen("in.txt","r",stdin);
  39. freopen("out.txt","w",stdout);
  40. #endif
  41. read(n),read(m);
  42. while(m--)
  43. read(a),read(b),
  44. e[a].push_back(b),
  45. e[b].push_back(a);
  46. for(root=1;root<=n;root++)
  47. if(!dfn[root]) tarjan(root);
  48. for(int i=1;i<=n;i++) if(cut[i]) ans++;
  49. cout<<ans<<endl;
  50. for(int i=1;i<=n;i++) if(cut[i]) cout<<i<<' ';
  51. }
  • 样例输入:

    7 10

    1 2

    2 3

    3 4

    2 4

    1 4

    1 5

    5 6

    5 8

    7 8

    5 7
  • 样例输出

    2

    1 5

\(\Huge{割边}\)

  • \(无向图的割边判定法则\)

    • 在遍历到一个点x 的子节点y,满足 \(low[y]>dfn[x]\),则 \((x,y)\) 这条边就是割边;
    • \(low[y]>dfn[x]\) ,说明不经过 \((x,y)\) ,y无法到达比x更早的点,故割掉这条边;
    • 反之,若 \(low[y]<=dfn[x]\),则y能够到达x或比x更早的点,\((x,y)\) 就不是割边,即环内没有割边;
    • \(注意事项:\)
      • 求桥的时候,议案为边是无向的,所以父亲与孩子的关系也要自己规定一下,正常的 $ else low[x]=min(low[x],low[y])$ 应改为 $ else if(y!=fa) low[x]=min(low[x],low[y])$;因为如果y是x的父亲,这条无向边就被误认为是环了;
      • 找桥的时候,有重边的一定不是桥;





        割边是(1,2)和(1,5)。
  • 板子:洛谷 P1656 炸铁路
  • 题目描述

    A国要使B国的铁路系统瘫痪,要炸毁一条铁路使其铁路无法全部联通,问可炸毁那一条铁路?
  • 输入格式

    第一行 \(n,m\) (\(1<=n<=150,1<=m<=5000\)),分别表示n个城市和m条铁路。

    以下m行,每行 \(a,b\) ,表示城市a和城市b间有铁路直接联通。
  • 输出格式

    输出若干行,每行 \(a,b\) ,其中 \(a<b\) ,表示\((a,b)\)是 \(key road\) .

    请注意:输出时,所有的数对必须按照a从小到大排序输出,若a相同,根据b从小到大输出。
  • 代码实现:
  1. //无向图割边模板,炸铁路
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #define endl '\n'
  5. #define N 200
  6. #define M 20001
  7. using namespace std;
  8. template<typename Tp> inline void read(Tp&x)
  9. {
  10. x=0;register bool f=1;
  11. register char c=getchar();
  12. for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=0;
  13. for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
  14. x=(f?x:~x+1);
  15. }
  16. int n,m,a,b,tot,ans,dfn[N],low[N];
  17. bool v[N][N],again[N][N];
  18. vector<int> e[M];
  19. struct aa{int l,r;}s[M];
  20. bool cmp(aa s1,aa s2){if(s1.l==s2.l) return s1.r<s2.r;return s1.l<s2.l;}
  21. void tarjan(int x,int fa)
  22. {
  23. dfn[x]=low[x]=++tot;
  24. for(int y:e[x])
  25. if(!dfn[y])
  26. {
  27. tarjan(y,x),
  28. low[x]=min(low[x],low[y]);
  29. if(low[y]>dfn[x]) s[++ans]=(aa){x,y};
  30. }
  31. else if(y!=fa||again[x][y]) low[x]=min(low[x],dfn[y]);//重边一定不是割边
  32. }
  33. signed main()
  34. {
  35. #ifndef ONLINE_JUDGE
  36. freopen("in.txt","r",stdin);
  37. freopen("out.txt","w",stdout);
  38. #endif
  39. read(n),read(m);
  40. while(m--)
  41. {
  42. read(a),read(b);
  43. if(v[a][b])
  44. {
  45. again[a][b]=again[b][a]=1;//判断重边
  46. continue;
  47. }
  48. v[a][b]=v[b][a]=1,
  49. e[a].push_back(b),
  50. e[b].push_back(a);
  51. }
  52. for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,i);
  53. stable_sort(s+1,s+1+ans,cmp);
  54. for(int i=1;i<=ans;i++) cout<<s[i].l<<' '<<s[i].r<<endl;
  55. }
  • 样例输入

    7 10

    1 2

    2 3

    2 4

    3 4

    1 5

    5 6

    5 7

    7 8

    5 8

    6 5
  • 样例输出

    1 2

    1 5

tarjan无向图割点与割边板子的更多相关文章

  1. 图论分支-Tarjan初步-割点和割边

    所谓割点(顶)割边,我们引进一个概念 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图. 割边(桥):删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥. 这样大家就 ...

  2. tarjan求割点与割边

    tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...

  3. hihoCoder 1183 连通性一·割边与割点(Tarjan求割点与割边)

    #1183 : 连通性一·割边与割点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 还记得上次小Hi和小Ho学校被黑客攻击的事情么,那一次攻击最后造成了学校网络数据的丢 ...

  4. Tarjan在图论中的应用(二)——用Tarjan来求割点与割边

    前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...

  5. 『Tarjan算法 无向图的割点与割边』

    无向图的割点与割边 定义:给定无相连通图\(G=(V,E)\) 若对于\(x \in V\),从图中删去节点\(x\)以及所有与\(x\)关联的边后,\(G\)分裂为两个或以上不连通的子图,则称\(x ...

  6. Tarjan无向图的割点和桥(割边)全网详解&算法笔记&通俗易懂

    更好的阅读体验&惊喜&原文链接 感谢@yxc的腿部挂件 大佬,指出本文不够严谨的地方,万分感谢! Tarjan无向图的割点和桥(割边) 导言 在掌握这个算法前,咱们有几个先决条件. [ ...

  7. Tarjan 强连通分量 及 双联通分量(求割点,割边)

    Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1)         有向图的强联通分量 (2)         无向图的双联通分量(求割点,桥) ...

  8. Tarjan 算法求割点、 割边、 强联通分量

    Tarjan算法是一个基于dfs的搜索算法, 可以在O(N+M)的复杂度内求出图的割点.割边和强联通分量等信息. https://www.cnblogs.com/shadowland/p/587225 ...

  9. tarjan求割点割边的思考

    这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...

  10. POJ1144 tarjan+网络中割点与割边的数量

    题目链接:http://poj.org/problem?id=1144 割点与割边的数量我们可以通过tarjan的思想从一个点开始对其余点进行访问.访问的顺序构成一棵dfs树,其中根节点到任何一个结点 ...

随机推荐

  1. 遗传算法解决航路规划问题(MATLAB)

    遗传算法 文章部分图片和思路来自司守奎,孙兆亮<数学建模算法与应用>第二版 定义:遗传算法是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,模拟自然界中的声明进化机制,在人工系统中实 ...

  2. Mac SpringBoot项目 Gradle 7.3 转 Maven 手把手教学,包学会~

    导读 最近我手上有个使用Gradle构建的项目,国内使用Gradle的人相对较少.而且我也觉得Gradle的依赖管理方式有些复杂,让我感到有些困惑.因此,我想将项目转换为Maven构建方式.Maven ...

  3. Vue.js 官方脚手架 create-vue 是怎么实现的?

    Vue.js 官方脚手架 create-vue 是怎么实现的? 摘要 本文共分为四个部分,系统解析了vue.js 官方脚手架 create-vue 的实现细节. 第一部分主要是一些准备工作,如源码下载 ...

  4. 【krpano】 ASP浏览量插件

    简述 这是一个Asp版krpano统计访问量案例,运用asp代码控制增值来实现的功能:现将案例上传网站供大家学习研究,希望对大家有所帮助. 功能 用户进入网页增值或刷新增值. 案例展示 所有文件如下图 ...

  5. Unity 游戏开发、03 基础篇 | C#初级编程

    C#初级编程 https://learn.u3d.cn/tutorial/beginner-gameplay-scripting 8 Update 和 FixedUpdate Update(不是按固定 ...

  6. 深入浅出:SPI机制在JDK与Spring Boot中的应用

    本文分享自华为云社区<Spring高手之路14--深入浅出:SPI机制在JDK与Spring Boot中的应用>,作者:砖业洋__ . Spring Boot不仅是简化Spring应用开发 ...

  7. [NSSCTF 2022 Spring Recruit]ezgame

    打开题目,发现是一个网页小游戏,就开始F12 提示到,需要分数超过65,才会得到flag 但不可能用手点吧(不怕麻烦还是可以) flag肯定是藏在了某个地方,仔细找找 发现有一个css,js文件,依次 ...

  8. Nacos有几种负载均衡策略?

    Nacos 作为目前主流的微服务中间件,包含了两个顶级的微服务功能:配置中心和注册中心. 1.配置中心扫盲 配置中心是一种集中化管理配置的服务,通俗易懂的说就是将本地配置文件"云端化&quo ...

  9. angular,vue,react三大框架选型

    三大框架,本质都是基于js的web应用(前端做的都是web应用包括移动)框架,他们都是帮助我们解决问题的工具,具体用哪个,要结合具体场景. 这三者中,Angular的适用领域相对窄一些,React可以 ...

  10. games101-1 光栅化与光线追踪中的空间变换

    在学习了一些games101的课程之后,我还是有点困惑,对于计算机图形学的基础知识,总感觉还是缺乏一些更加全面的认识,幸而最*在做games101的第五次作业时,查询资料找到了scratchpixel ...