图的割点

  • 1.割点是什么
  • 2.找割点的办法
    • 2.1方法的核心
    • 2.2 具体过程
    • 2.3实现

1.割点是什么

在一个无向连通图中,如果删除某个顶点后,图不再连通(任意两顶点之间不能相互到达),我们称这样的顶点为割点。

2.找割点的办法

很容易就可以想到一个方法,依次删除每一个顶点,然后对图进行DFS或BFS或并查集来判断图是否连通。如果删除某个顶点后,导致图不再连通,那么说明该顶点就是割点。
但是对每一个顶点都进行遍历,时间复杂度会很高。

下面介绍另外一种方法,
从图的某个顶点(假设为1号顶点)开始进行DFS遍历,加入遍历到了节点k,此时图的顶点就会被分割为2部分,一部分是已经被访问过的节点,另一部分是还没有被访问的节点。如果k是割点,那么可以判定在还没有被访问的节点中至少存在一个节点在不经过节点k的情况下,是回不到已经访问过的节点的,所以在这种情况下,图就被分割成为了多个不连通的子图。

2.1方法的核心

当DFS访问节点u时,假设图中还有节点v没有被访问,则可以通过如下方法判断节点v在不经过节点u的情况下是否能回到祖先:
对顶点v再进行一次DFS,但是此次遍历不允许经过节点u,看看是否能回到祖先,如果不能则说明节点u是割点。

2.2 具体过程

节点旁边的(x,y)分别表示:该节点第x次被遍历,在该节点回溯过程中不经过父节点最近的一个节点,即下文中的num[i]和low[i]。

2.3实现

#include <iostream>
#include <vector>using namespace std;/*
* 测试用例
6 7(顶点数和边数)
1 4
1 3
4 2
3 2
2 5
2 6
5 6
*/
class Cut_point
{private:int vertice = 0;//顶点数int edge = 0;//边数//0行0列不存储信息,graph[i][j]表示节点i到节点j的权值为graph[i][j]vector<vector<int>> graph;//存储图的信息//在所有的数组中下标0均不存值vector<int> flag;//记录图中的割点,即flag[i] == 1;vector<int> num;//记录每个节点遍历的顺序(num[i] = j表示节点i是第j个被遍历的)vector<int> low;//记录节点不经过父顶点回溯的最早的节点(low[i] = j表示节点i最早回到j节点)int root = 1;//记录根节点int index = 0;//记录num中的值public:Cut_point(int x = 0, int y = 0) :vertice(x), edge(y){graph.resize(vertice + 1);for (int i = 0;i <= vertice; i++){graph[i].resize(vertice + 1,0);}flag.resize(vertice + 1, 0);num.resize(vertice + 1, 0);low.resize(vertice + 1, 0);}//图以及图相关的数据结构初始化void Init_Graph(){int u = 0, v = 0;for (int i = 0; i < edge; i++){cin >> u >> v;graph[u][v] = 1;graph[v][u] = 1;//无向图的初始化,没有权重信息,初始化为1即可}}vector<int> Cut_point_By_DFS(int curernt,int father){int child = 0;//记录current节点的汉字总数index++;//当前访问的顺序加1num[curernt] = index;//表示current节点是在第index被访问的low[curernt] = index;for (int i = 1; i <= vertice; i++){if (graph[curernt][i] == 1){//节点i还没有被访问过if (num[i] == 0){child++;//i是current的孩子Cut_point_By_DFS(i, curernt);//继续往下DFS//个人理解:在所有到current的边中,找最小下标的 low[curernt] = min(low[curernt], low[i]); //更新current节点能够访问到的最早顶点的顺序if (curernt != root && low[i] >= num[curernt])//当前节点不是根节点,并且满足low[i] >= num[current],则当前节点为割点{flag[curernt] = 1;}//如果当前顶点是根节点,在生成树中根节点中必须要有两个儿子,那么这个根节点才是割点if (curernt == root && child == 2){flag[curernt] = 1;}}else{//节点i已经被访问过,并且这个顶点不是当前节点current的父亲,则说明此时的i为current的祖先,//因此就需要更新当前节点current能够访问到最早顶点的indexlow[curernt] = min(low[curernt], num[i]);}}}return flag;}
};int main()
{int vertice = 0, edge = 0;//顶点数,边数cout << "请输入顶点数和边数:" << endl;cin >> vertice >> edge;vector<int> flag;Cut_point point(vertice,edge);cout << "请输入边的信息:" << endl;point.Init_Graph();flag = point.Cut_point_By_DFS(1, 1);//从1号顶点开始进行DFS,并且认为1号顶点是根节点cout << "割点为:";for (int i = 1; i <= vertice; i++){if (flag[i] == 1){cout << i << "    ";}}return 0;
}

图的割点(解释及实现)相关推荐

  1. 图的割点、桥与双连通分支

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  2. 图的割点(边表集实现)

    /*     Name: 图的割点(边表集实现)     Copyright:      Author: 巧若拙      Date: 20-11-14 21:17     Description:  ...

  3. [转载]图的割点、桥与双连通分支

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  4. 图的割点 图的割边 二分图

    枯木逢春不再茂,年少且惜镜边人 这周准备完结阿哈算法,其中有一章的学习不是很熟练(总之学的慢,忘的快.哎,真的,学完得好好从背包开始复习了,等复习完了,准备进行更深层次的学习,也就是从做题中获取知识, ...

  5. 图的割点 桥 双连通(byvoid)

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  6. 图的割点、桥和双连通分支的基本概念

    点连通度与边连通度 回到正题,首先介绍下什么是图的边连通度和点连通度.一般来说,点连通度是指对应一个图G,对于所有点集U属于V(G),也就是V(G)的子集中,使得G-U要么是一个非连通图,要么就是一个 ...

  7. 图的割点、桥与双连通分支的基本概念

    [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...

  8. 图中割点、割边的理解

    割点集合 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.(一般是有多个顶点组成) 割边集合 在一个无向连通 ...

  9. 20 求图的割点和割边—Tarjan算法

    1 图的割点 问题描述 去掉2号城市,这样剩下的城市之间就不能两两相互到达.例如4号城市不能到5号城市,6号城市也不能到达1号城市等等. 下面将问题抽象化.在一个无向连通图中,如果删除某个顶点后,图不 ...

最新文章

  1. Android stadio bug
  2. 封装 继承 多态_Java基础知识——封装、继承、多态
  3. linux 内核编译错误 gcc: error: elf_i386: No such file or directory
  4. java int interger_java面试题之int和Integer的区别
  5. java cocoon_Java-跳跃路线
  6. 刚从阿里面试回来已拿到offer想和大家分享一下(阿里面试经验)
  7. python matplotlib.pyplot.imshow() (在2D常规栅格上显示图像(数据))
  8. tabindex, taborder和notab属性的区别
  9. Linux下导出MySQL为SQL文件_MySQL导入导出.sql文件步骤
  10. windows ***的搭建
  11. Extjs window autoload
  12. 大学生创新创业 /互联网+ 大赛 商业计划书目录(模板)
  13. ZZULIOJ.1137: 查找最大元素
  14. 通俗易懂的数学建模示例(一)
  15. 累计独立访客(UV)不低于 1000 是什么意思,快速开通流量主
  16. secureCRT注册码
  17. 字体小三、小四号字的数字表示是多少
  18. java学生成绩降序代码_输入5名学员成绩,降序排列输出
  19. MLIR深入 —— 转换流程详解(以Toy接入为例)
  20. python爬取淘宝商品做数据挖掘

热门文章

  1. Git提交数据失败 error: failed to push some refs to 'https://github.com/XXXXXXX/gif.git'
  2. 视觉SLAM开源方案汇总及设备选型建议
  3. Android 存储相册,Android 相册图片存储
  4. Android生态系统进化论
  5. 【Android】图像滤镜框架GPUImage从配置到应用
  6. Android 隐藏 返回键 Home键 隐藏最下面的NAVIGATION栏
  7. mysql查询所有学生各科成绩按照总成绩降序排列
  8. 1033 旧键盘打字 (20分)
  9. centos7图形界面和dos界面
  10. 如何用U盘进行装机?