对于一个有桥的连通图,加边变成边双连通图

1.求出所有的桥,然后删除这些桥边。剩下的每个连通块都是一个双连通子图。

2.把每个双连通子图收缩为一个顶点。

3.加回桥边,统计度为1的节点的个数(叶节点的个数),记为 leaf

则:至少在树上加 (leaf+1)/2 条边,就能使树达到边双连通

除使用两次 dfs 外,还可以使用 Tarjan 算法一次求出所有点的 low[i] 值,由于同一个边双连通分量的点他们的 low[i] 值一定相同,因此对于不同边双连通分量的点,他们的 low 值一定不同。

int n,m;
int dfn[N],low[N];
int degree[N];
int block_cnt;
vector<int> G[N];
int Tarjan(int x,int father) {int lowx=dfn[x]=++block_cnt;for(int i=0; i<G[x].size(); i++) {int y=G[x][i];if(y==father)continue;if(dfn[y]==0) {int lowy=Tarjan(y,x);lowx=min(lowx,lowy);} else if(dfn[y]<dfn[x])lowx=min(lowx,dfn[y]);}return low[x]=lowx;
}
int main() {scanf("%d%d",&n,&m);block_cnt=0;memset(dfn,0,sizeof(dfn));memset(degree,0,sizeof(degree));for(int i=0; i<n; i++)G[i].clear();for(int i=1; i<=m; i++) {int x,y;scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}Tarjan(1,-1);//求所有点的low值for(int x=1; x<=n; x++) { //遍历每条边for(int i=0; i<G[x].size(); i++) {int y=G[x][i];if(low[x]!=low[y])//每个不同的low值代表一个边双连通分量degree[low[y]]++;}}int cnt=0;for(int i=1; i<=n; i++)if(degree[i]==1)cnt++;printf("%d\n",(cnt+1)/2);//加边条数/**  边双连通分量个数*  int cnt=0;*  for(int i=1;i<=n;i++)*      if(degree[i]>0)*          cnt++;*  printf("%d\n",cnt);*/return 0;
}

图论 —— 图的连通性 —— 有桥连通图加边变边双连通图相关推荐

  1. 图论 —— 图的连通性

    [基本概念] 1.连通图与连通分量 1)连通图:无向图 G 中,若对任意两点,从顶点 Vi 到顶点 Vj 有路径,则称 Vi 和 Vj 是连通的,图 G 是一连通图 2)连通分量:无向图 G 的连通子 ...

  2. 图论 —— 图的连通性 —— 传递闭包

    [概述] 传递闭包:对于一个节点 i,如果 j 能到 i,i 能到 k,那么 j 就能到 k,求传递闭包,就是把图中所有满足这样传递性的节点计算出来,计算完成后,就知道任意两个节点之间是否相连. 简单 ...

  3. 图论 —— 图的连通性 —— Tarjan 求双连通分量

    [概念] 1.双连通分量:对于一个无向图,其边/点连通度大于1,满足任意两点之间,能通过两条或两条以上没有任何重复边的路到达的图,即删掉任意边/点后,图仍是连通的 2.分类: 1)点双连通图:点连通度 ...

  4. 图论 —— 图的连通性 —— Tarjan 求割点与桥

    [概念] 1.割点 1)割点:删除某点后,整个图变为不连通的两个部分的点 2)割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 3)点连通度:最小割点集合点数 如上 ...

  5. 图论 —— 图的连通性 —— Kosaraju 算法

    [概述] Kosaraju 算法是最容易理解,最通用的求强连通分量的算法,其关键的部分是同时应用了原图 G 和反图 GT . [基本思想] 1.对原图 G 进行 DFS 搜索,计算出各顶点完成搜索的时 ...

  6. 图论 —— 图的连通性 —— Tarjan 缩点

    缩点常应用于给一个有向图,求在图中最少要加多少条边能使得该图变成一个强连通图 首先求出该图的各个强连通分量,然后把每个强连通分量看出一个点(即缩点),最后得到了一个有向无环图(DAG) 对于一个DAG ...

  7. 图论 —— 图的连通性 —— Tarjan 求强连通分量

    [概述] Tarjan 算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树. 搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量. [ ...

  8. 图论 —— 图的连通性 —— 并查集判断连通性

    当需要判断图是否为连通图时,可以使用并查集来进行连通分量的统计,若连通分量大于 1,则说明图中存在多个连通分量,图不为连通图. int n,m; int father[N]; int Find(int ...

  9. 电子科技大学《图论及其应用》复习总结--第三章 图的连通性

    第三章 图的连通性 一.割边.割点和块 (一).割边及其性质 定义1 边e为图G的一条割边,如果 w(G−e)>w(G)w(G-e)>w(G)w(G−e)>w(G) 定理1 边 e ...

最新文章

  1. Python模拟登录,Python识别图形验证码实现自动登陆
  2. 求1到30的阶乘和(Java)
  3. python redis处理高并发-Python高并发解决方案实现过程详解
  4. 成功解决VM虚拟机内This compute has only 713.3MB disk space remaning
  5. MySQL数据库Innodb储存引擎----储存页的结构
  6. 软考考前冲刺第九,十章多媒体基础知识知识产权基础知识
  7. toast弹窗_Android 开发(一):Toast弹窗与获取控件的值
  8. Python:Anaconda安装虚拟环境到指定路径
  9. 双十一流量洪峰 支撑阿里核心业务的云数据库揭秘 1
  10. 票房连创新高 数据安全不能成为《熊出没》“拖油瓶”
  11. spring mvc 中,直接注入的 HttpServletRequst 是否安全呢?
  12. the vmrc console has disconnected attempting to reconnect
  13. Java基础面试题(2022年)
  14. Grasshopper and Rhino: Python Scripting Grasshopper和Rhino:Python脚本 Lynda课程中文字幕
  15. xp关机时询问对计算机做什么,XP关机的六个方法
  16. 常识系列:显示屏 分辨率 SD HD FHD 的区别解释
  17. JSR 168 翻译03
  18. 二进制文件文本文件和二进制数据
  19. 物联网周刊(第 6 期):开源硬件公司 Adafruit
  20. 计算机组成原理哈工大期末_计算机组成原理(哈工大)——课程知识点总结

热门文章

  1. 格密码教程(二):格的基本定义,格基转换
  2. Linux下动态库的创建与更新
  3. Simulink之单管非隔离直流斩波器
  4. spring:我是如何解决循环依赖的?
  5. 2020年Java程序员应该学习的10大技术
  6. 十年后,你在元宇宙中的一天是什么样?
  7. 刘朋:程序员如何练就领导力
  8. 蚂蚁资深算法专家周俊:从原理到落地,支付宝如何打造保护隐私的共享智能?...
  9. 使用proguard混淆java web项目代码
  10. 数据源管理 | 关系型分库分表,列式库分布式计算