图论 —— 图的连通性 —— 有桥连通图加边变边双连通图
对于一个有桥的连通图,加边变成边双连通图
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)连通图:无向图 G 中,若对任意两点,从顶点 Vi 到顶点 Vj 有路径,则称 Vi 和 Vj 是连通的,图 G 是一连通图 2)连通分量:无向图 G 的连通子 ...
- 图论 —— 图的连通性 —— 传递闭包
[概述] 传递闭包:对于一个节点 i,如果 j 能到 i,i 能到 k,那么 j 就能到 k,求传递闭包,就是把图中所有满足这样传递性的节点计算出来,计算完成后,就知道任意两个节点之间是否相连. 简单 ...
- 图论 —— 图的连通性 —— Tarjan 求双连通分量
[概念] 1.双连通分量:对于一个无向图,其边/点连通度大于1,满足任意两点之间,能通过两条或两条以上没有任何重复边的路到达的图,即删掉任意边/点后,图仍是连通的 2.分类: 1)点双连通图:点连通度 ...
- 图论 —— 图的连通性 —— Tarjan 求割点与桥
[概念] 1.割点 1)割点:删除某点后,整个图变为不连通的两个部分的点 2)割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 3)点连通度:最小割点集合点数 如上 ...
- 图论 —— 图的连通性 —— Kosaraju 算法
[概述] Kosaraju 算法是最容易理解,最通用的求强连通分量的算法,其关键的部分是同时应用了原图 G 和反图 GT . [基本思想] 1.对原图 G 进行 DFS 搜索,计算出各顶点完成搜索的时 ...
- 图论 —— 图的连通性 —— Tarjan 缩点
缩点常应用于给一个有向图,求在图中最少要加多少条边能使得该图变成一个强连通图 首先求出该图的各个强连通分量,然后把每个强连通分量看出一个点(即缩点),最后得到了一个有向无环图(DAG) 对于一个DAG ...
- 图论 —— 图的连通性 —— Tarjan 求强连通分量
[概述] Tarjan 算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树. 搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量. [ ...
- 图论 —— 图的连通性 —— 并查集判断连通性
当需要判断图是否为连通图时,可以使用并查集来进行连通分量的统计,若连通分量大于 1,则说明图中存在多个连通分量,图不为连通图. int n,m; int father[N]; int Find(int ...
- 电子科技大学《图论及其应用》复习总结--第三章 图的连通性
第三章 图的连通性 一.割边.割点和块 (一).割边及其性质 定义1 边e为图G的一条割边,如果 w(G−e)>w(G)w(G-e)>w(G)w(G−e)>w(G) 定理1 边 e ...
最新文章
- Python模拟登录,Python识别图形验证码实现自动登陆
- 求1到30的阶乘和(Java)
- python redis处理高并发-Python高并发解决方案实现过程详解
- 成功解决VM虚拟机内This compute has only 713.3MB disk space remaning
- MySQL数据库Innodb储存引擎----储存页的结构
- 软考考前冲刺第九,十章多媒体基础知识知识产权基础知识
- toast弹窗_Android 开发(一):Toast弹窗与获取控件的值
- Python:Anaconda安装虚拟环境到指定路径
- 双十一流量洪峰 支撑阿里核心业务的云数据库揭秘 1
- 票房连创新高 数据安全不能成为《熊出没》“拖油瓶”
- spring mvc 中,直接注入的 HttpServletRequst 是否安全呢?
- the vmrc console has disconnected attempting to reconnect
- Java基础面试题(2022年)
- Grasshopper and Rhino: Python Scripting Grasshopper和Rhino:Python脚本 Lynda课程中文字幕
- xp关机时询问对计算机做什么,XP关机的六个方法
- 常识系列:显示屏 分辨率 SD HD FHD 的区别解释
- JSR 168 翻译03
- 二进制文件文本文件和二进制数据
- 物联网周刊(第 6 期):开源硬件公司 Adafruit
- 计算机组成原理哈工大期末_计算机组成原理(哈工大)——课程知识点总结