020-寻找图的关节点-dfs-《算法设计技巧与分析》M.H.A学习笔记
来源:互联网 发布:千牛淘宝商品怎么分类 编辑:程序博客网 时间:2024/05/16 11:14
关节点的定义:
在多于两个顶点的无向图G中,存在一个顶点v,如果有不同于v的两个顶点u和w,在u和w间的任何路径都必定经过顶点v,则称v为关节点。
一种更形象的说法:
关节点也叫割点,连通图中删去割点会被分割成几个连通分量。
我们可以通过dfs来寻找关节点。
基本思路:
在图G上进行一个dfs,遍历过程中对每个顶点v保持两个标号α[v]和β[v],α[v]为dfs的深度,β[v]初始化为α[v]在遍历过程中修改为下列几个中的最小值:
1. α[v];
2. α[u],对于每个顶点u,(v,u)是回边;
3. β[w],在dfs树中的每条边(v,w)。
关节点确定如下:
1. 根是一个关节点当且仅当在dfs树中,它有两个或更多的儿子。
2. 根以外的顶点v是一个关节点当且仅当v有一个儿子w,使得β[w]>=α[v]。
伪代码:
C++代码:
来自http://www.xuebuyuan.com/1479536.html
#include <cstdio>#include <cstdlib>#define VERTEX_NUM7#define NOT_VISITED 0int dfn;//表示某顶点在深度优先遍历中被访问的顺序void find_articulation(int adj[][VERTEX_NUM], int visit[], int low[]);//寻找图的关节点,并输出void DFS_articulation(int adj[][VERTEX_NUM], int vertex, int visit[], int low[]);//从vertex顶点出发,查找并输出关节点int main(){//无向连通图的邻接表数据,-1表示结束int Adj[VERTEX_NUM][VERTEX_NUM] = {{0, 1, 3, -1},{1, 0, 2, 3, 4, -1},{2, 1, 3, 4, 5, -1},{3, 0, 1, 2, 4, -1},{4, 1, 2, 3, 5, -1},{5, 4, 6, -1},{6, 5, -1}};int low[VERTEX_NUM];//low[]数组的意义见上面的分析int visit[VERTEX_NUM];for (int i = 0; i < VERTEX_NUM; i++)visit[VERTEX_NUM] = NOT_VISITED;//查找图的关节点,并输出find_articulation(Adj, visit, low);system("pause");return 0;}void find_articulation(int adj[][VERTEX_NUM], int visit[], int low[])//visit[i]保存顶点i被访问的顺序{dfn = 1;visit[adj[0][0]] = 1;//设adj[0][0]顶点为生成树的根for (int i = 1; i < VERTEX_NUM; i++)visit[i] = NOT_VISITED;int vertex = adj[0][1];DFS_articulation(adj, vertex, visit, low);if (dfn < VERTEX_NUM)//生成树的根至少有两棵子树{printf("%d ", vertex);//输出关节点for (int j = 1; adj[0][j] != -1; j++)if (visit[adj[0][j]] == NOT_VISITED)DFS_articulation(adj, adj[0][j], visit, low);}}void DFS_articulation(int adj[][VERTEX_NUM], int vertex, int visit[], int low[]){dfn++;int min = dfn;visit[vertex] = dfn;for (int j = 1; adj[vertex][j] != -1; j++){int w = adj[vertex][j];if (visit[w] == NOT_VISITED){
0 0
- 020-寻找图的关节点-dfs-《算法设计技巧与分析》M.H.A学习笔记
- 019-dfs.bfs-图的遍历-《算法设计技巧与分析》M.H.A学习笔记
- 004-寻找多数元素-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 006-寻找最大值和最小值-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 007-寻找第k小元素-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 013--Floyd算法-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 015-Dijkstra算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 016-kruskal算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 017-Prim算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 001-整数快速幂-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 003-生成排列-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 005-二分搜索-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 008-大整数乘法-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 009-矩阵乘法-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 012-矩阵链相乘-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 014-背包问题-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 018-Huffman树-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 022-3着色问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- Android 属性动画实现抛物线动画
- IOS 协议和代理模式 With小demo
- leetcode-java-318. Maximum Product of Word Lengths
- 通向自由的钥匙
- java获取服务器地址
- 020-寻找图的关节点-dfs-《算法设计技巧与分析》M.H.A学习笔记
- jackson joda time序列化
- lua学习笔记--两个实例(markov chain 和 递归上台阶算法)
- 实习杂记(26):Java 8十个lambda表达式案例
- libevent学习笔记 - 2 event_base
- ThinkPHP页面跳转success与error方法
- 分布式中,dao层mapping的xml文件处理
- ImageLoader,(Application包下的,MyApplication)
- av_write_frame 与 av_interleaved_write_frame