线性时间查找一个图中的所有node-cut点分割
2016-08-25 21:37
239 查看
node-cut定义:
对于一个无向图G,如果删除一个点v可以增加联通分支的数量,那么我们称点v是图G的一个node-cut,即点分割。(注意和最小割是有区别的,最小割是用移除最少了边使得原图不联通,可以用流算法去解决)
node-cut的性质:
对于点p,如果存在一个子节点q,在q点的DFS搜索树上如果没有存在反向边指向DFS搜索中p的祖先节点,那么对于这样的p点是原图的node-cut。
基于这样的性质,我们可以用一次DFS来找出原图的所有node-cut,具体的一些设定可以参考《算法导论》图算法部分的DFS章节:(白色节点表示未被访问过,灰色节点表示第一次访问到,黑色节点表示访问结束):时间复杂度是O(V+E)
DFS过程中每个节点增加一个变量ctime(v),默认为-1,记录自身或者DFS搜索树中子节点指向DFS点中灰色点u最小的d(u)。当p点结束DFS搜索由灰变黑时,将ctime(p)传递给DFS父节点q,如果ctime(p)<ctime(q),ctime(q):=ctime(p)。当一个点v从灰变成黑时,可以根据ctime(v)和ctime(v)比较判断自身是否是node-cut。
附:DFS的root结点需要单独判断,如果dfs生成树的子节点数量大于等于2,那么根节点为cut-node,反之不为cut-node。
上述性质来自这篇paper:
A Silent Self-Stabilizing Algorithm for finding Cut-nodes and Bridges
这篇paper还给出了另外找node-cut的算法,有点长不大想看就自己想了一个算法。
2016年8月26日更新算法实现:
cut-node线性算法的实现
对于一个无向图G,如果删除一个点v可以增加联通分支的数量,那么我们称点v是图G的一个node-cut,即点分割。(注意和最小割是有区别的,最小割是用移除最少了边使得原图不联通,可以用流算法去解决)
node-cut的性质:
对于点p,如果存在一个子节点q,在q点的DFS搜索树上如果没有存在反向边指向DFS搜索中p的祖先节点,那么对于这样的p点是原图的node-cut。
基于这样的性质,我们可以用一次DFS来找出原图的所有node-cut,具体的一些设定可以参考《算法导论》图算法部分的DFS章节:(白色节点表示未被访问过,灰色节点表示第一次访问到,黑色节点表示访问结束):时间复杂度是O(V+E)
DFS过程中每个节点增加一个变量ctime(v),默认为-1,记录自身或者DFS搜索树中子节点指向DFS点中灰色点u最小的d(u)。当p点结束DFS搜索由灰变黑时,将ctime(p)传递给DFS父节点q,如果ctime(p)<ctime(q),ctime(q):=ctime(p)。当一个点v从灰变成黑时,可以根据ctime(v)和ctime(v)比较判断自身是否是node-cut。
附:DFS的root结点需要单独判断,如果dfs生成树的子节点数量大于等于2,那么根节点为cut-node,反之不为cut-node。
上述性质来自这篇paper:
A Silent Self-Stabilizing Algorithm for finding Cut-nodes and Bridges
这篇paper还给出了另外找node-cut的算法,有点长不大想看就自己想了一个算法。
2016年8月26日更新算法实现:
cut-node线性算法的实现
相关文章推荐
- 快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。 输入 给出一个正整数数N(N<=
- C#,net查找一个Node所有子节点,演示递归调用
- 长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为X的元素
- 一个线性时间复杂度的质因数分解函数(查找全部的素数、得到全部的质因数分解个数)
- 利用JAVA反射技术查找一个类的所有属性
- poj 1177 又是一道十分恶心到线段树。 主要是用线段树到区间操作。可以用来节省线性查找的时间。 离散化也十分好的一道题。
- C++ 中关于一个线性时间算法(linear-time algorithm)
- 在一个目录及其所有子目录下所有的文件中查找某个单词
- 利用 SHDocVw::IShellWindowsPtr m_spSHWinds 遍历所有IE浏览器,得到里面的所有元素 还有一个是查找IE窗口里的submit按钮,模拟点击
- hdu 3433 A Task Process N个人,第i个人完成一个A任务需要时间ai,完成一个B任务需要时间bi, 现在又X个任务A和Y个任务B,求完成所有任务所需要的最短时间。
- 使用ruby写了一个根据ftp服务器列表自动遍历所有服务器查找对应的东东
- 利用JAVA反射技术查找一个类的所有属性
- 一个线性时间下的原地置换排序算法
- 查找某一个数据库中的所有表名
- 根据实体中一个属性值查找实体数组中的所有实体并放到list中
- 算法题27 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
- 查找一个字符串在另一个字符串中出现的所有位置
- 在所有存储过程中查找一个关键字
- sqlserver 查找一个表中的所有列名
- 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,