无向图的割顶和桥
来源:互联网 发布:淘宝匡威官方旗舰店 编辑:程序博客网 时间:2024/04/28 06:36
定义:
1.对于无向图,如果删除某个点u后,连通分量的数目增加,称u为图的关节点或割点。对于连通图来说,删除割点后,图将变得不再连通。
2.设low(u) 为u及其后代所能连回的最早的祖先的pre值,当u的后代只能连回u自己时,即low[v]>pre[u] ,只需删除边u−>v ,即可让图非连通了,满足这个条件的边称为桥,也就是我们不仅知道了u是割点,还知道了u−>v 是桥。
求无向图的所有割点方法:
1.尝试删除每个节点,然后dfs判断连通分量是否增加;
2.线性时间内求出所有割点;
相关定理:
1.在无向图的dfs树中,非根节点u是G的割点当且仅当u存在一个子节点v,使得v及其所有后代都没有反向边连回u的祖先。
代码:
1.无向图的dfs森林
int dfs(int u){ vis[u] = 1; pre[u] = ++ord; int d = G[u].size(); for(int i = 0;i < d;i++){ int v = G[u][i]; if(!vis[v]) dfs(v); } post[u] = ++ord;}
2.求low函数及所有割顶
bool low[N],iscut[N];int dfs(int u,int fa){ int lowu = pre[u] = ++ord; int child = 0; for(int i = 0;i < G[u].size();i ++){ int v = G[u][i]; if(!pre[v]){ child++; int lowv = dfs(v,u); lowu = min(lowu,lowv);//利用后代的low函数更新u的low函数 if(lowv >= pre[u]){ iscut[u] = 1; } } else if(pre[v] < pre[u] && v != fa){ lowu = min(lowu,pre[v]); // 利用反向边更新u的low函数 } } if(fa < 0 && child == 1) iscut[u] = 0; return low[u] = lowu;}
0 1
- 【无向图的割顶和桥】
- 无向图的割顶和桥
- 无向图的割顶和桥
- 无向图的割顶和桥
- 无向图的割顶与桥
- 无向图的割顶与桥
- 无向图的割顶和桥,无向图的双连通分量入门详解及模板
- 图论总结(2)无向图的割顶和桥
- HDU 3849 无向图的割顶和桥模版题
- POJ-3352-无向图的割顶和桥-求边-双连通分量
- 深夜敲模板_4——无向图的割顶和桥
- 无向图的割顶、桥和双联通分量
- 无向图的割顶和桥(tarjan模板)
- 无向图的割顶、桥和边双连通分量
- 无向图的割顶和桥、无向图的双连通分量、有向图的强连通分量
- 连通分量 无向图的割顶和桥 无向图的双连通分量 有向图的强连通分量
- 无向图的割顶(poj1523,1144)
- 无向图的割点和桥
- Junit框架的使用
- 黑马程序员——Java基础---集合
- 黑马程序员
- 写一个函数将传入的字符串转换成驼峰表示法
- listView重复调用getView的问题
- 无向图的割顶和桥
- 使用ret2plt绕过libc安全区
- HDUOJ-1879(继续畅通工程)(最小生成树)
- Linux网络编程(附1)——封装read、write
- arm汇编控制led灯
- 黑马程序员——C语言笔记之预处理指令和模块化编程
- 浅谈Android列表ListView下拉刷新控件的实现(一)
- angular.fromJson方法与toJson方法
- Constructing Roads