posts - 74,  comments - 33,  trackbacks - 0
看了几天的题
终于找到相关知识
一、定义及应用
  在某图中,若删除顶点V以及V相关的边后,图的一个连通分量分割为两个或两个以上的连通分量,则称顶点V为该图的一个关节点。一个没有关节点的连通图称为重连通图。
  在重连通图中,任意一对顶点之间至少存在两条路径,则再删去某个顶点即相关各边后也不破坏图的连通性。若在图的连通图上删去k个节点才能破坏图的连通性,则称K为此图的连通度。
  他们常常在通信网络的图或航空网中应用,K越大,系统越稳定,反之,战争中若要摧毁敌方的运输线,只须破坏其运输网中的关节点即可。
  二、求解算法
  利用深度优先搜索便可以求的图的关节点,本由此可判别图是否重连通。
  从任一点出发深度优先遍历得到优先生成树,对书中任一顶点V而言,其孩子节点为邻接点。由深度优先生成树可得出两类关节点的特性:
  (1)若生成树的更有两棵或两棵以上的子树,则此根顶点必为关节点。因为图中不存在连接不同子树顶点的边,若删除此节点,则树便成为森林。
  (2)若生成树中某个非叶子顶点V,其某棵子树的根和子树中的其他节点均没有指向V的祖先的回边,则V为关节点。
  求关节点—对图进行一次先深搜索边可求出所有的关节点
  由先深生成树可得出两类关节点的特性:
  1.若生成树的根有两株或两株以上子树,则此根结点必为关节(第一类关节点)。因为图中不存在连接不同子树中顶点的边,因此,若删去根顶点,生成树变成生成森林。
  2.若生成树中非叶顶点v,其某株子树的根和子树中的其它结点均没有指向v 的祖先的回退边,则v 是关节点(第二类关节点)。 因为删去v,则其子树和图的其它部分被分割开来
  定义
  low[v] 设对连通图G=(V,E)进行先深搜索的先深编号为dnf[v],产生的先深生成树为S=(V,T),B试回退边之集。对每个顶点v,low[v]定义如下
  算法5.5 求无向图的双连通分量
  输入:连通的无向图G=( V, E )。L[v]表示关于v的邻接表
  输出:G的所有双连通分量,每个连通分量由一序列的边组成。
  算法要点:
  1.计算先深编号:对图进行先深搜索,计算每个结点v的先深编号dnf[v],形成先深生成树S=(V,T)。
  2.计算low[v]:在先深生成树上按后根顺序进行计算每个顶点v的 low[v], low[v]取下述三个结点中的最小者:
  (1) dfn[v];
  (2) dfn[w],凡是有回退边(v,w)的任何结点w;
  (3) low[y],对v的任何儿子y。
  3.求关节点:
  (1)树根是关节点,当且仅当它有两个或两个以上的儿子(第一类关节点);
  (2)非树根结点v是关节点当且仅当v有某个儿子y,使low[y]≥dnf[v](第二类关节点)。
posted on 2008-12-31 23:02 KNIGHT 阅读(671) 评论(1)  编辑 收藏 引用

FeedBack:
# re: 关节点
2008-12-31 23:36 | Together
在O(E)时间内求出一个连通无向图的所有关节点2006-11-21 11:391)首先定义关节点:Let G = (V, E) be a connected, undirected graph. An articulation point of G is a vertex whose removal disconnects G.
2)两个观察结论:
A. The root of Gπ is an articulation point of G if and only if it has at least two children in Gπ.
B. Let v be a nonroot vertex of Gπ. Prove that v is an articulation point of G if and only if
v has a child s such that there is no back edge from s or any descendant of s to a proper
ancestor of v 。

说明:Gπ 代表 G的深度优先搜索树 .. Back Edge : 深度优先搜索树中的边,如果在探索边(v,w)时,w是首次被访问的,则 边(v,w)是树边.其它的边就是 回边.(Back Edge).
解决办法:
容易看出,关键问题是怎样利用 B 结论 。
(实际上,一种比较费时的方法是: 利用观察结论A ,分别以图中每个顶点为根,深搜 N 次,那么就可以逐一判定每个顶点是不是关节点)
假设现在考察的 nonroot vertex的点是 V , 所考察的V的子节点是 s,那么如何判断有没有回边 (s ,V ) 和有没有 s 的一个后裔 W 是 V的祖先呢?
利用深度优先搜索时,直观的想,当搜索完 S的全部子节点后,S的信息才能收集全面。我们用
P(S)来表示以 S为根的搜索子树的信息。
P(S ) = min { P(W1),P(W2),P(W3),P(W4),P(W5)....P(Wn) } ,WI代表S的搜索后裔。
如果Wi没有回边,那么P(WI) = Q(WI ) ,后者代表第一次搜索到WI 时的序号。如果 WI有回边(WI , PP) ,那么 P(Wi) = P( PP ) .最后来判断 P(S )与Q(V)的大小。
如果 P(S) < Q(V) ,说明针对S ,V肯定不是关节点 ;
P(S) = Q(V) ,说明针对 S,V是关节点;
P(S) > Q(V) ,说明针对 S,V是关节点.
至此,我们讨论就可以结束了。下面给出一份伪代码:
输入:连通无向图 G = (V, E) .
输出:包含G的所有可能关节点的数组 A[1.......count ] 。

Start:
设S为起始顶点
for 每个顶点 v ∈V
标记 v 未访问
end for
predfn = 0 ;count = 0 ;rootdegree = 0
dfs(s);

过程 dfs(v )
//注意这个过程中,把v看成根 ,w是子节点,不要与上面的文字分析混了 .(这里的w与上面的s同)
标记v已访问;artpoint = false ;predfn = predfn +1 ;
Q[v] =predfn ; P[v] = predfn ;
for(每条边 (v,w )∈E) {
if (v,w)为树边 {
dfs(w)
if(v == s )then {
rootdegree ++ ;
if(rootdegree == 2 ) then artpoint = true ;
}
else {
P[v] = min{ P[v] , P[w]} ; // 给P[V]赋值,以便为上层提供信息.
// 针对V的判断,只需要知道P[w] 和Q[v]即可,对P[v] 的赋值是为上层提供信息
if(P[w] >= Q[v])
artpoint = true ; // Q[w] <p[v]说明有环路.
}
}
else if(v,w) is back edge {
P[v] = min{ P[v], Q[w] } // P[W]没有被有效赋值
}
else {/*do nothing*/}
end for

if(artpoint ){
count ++ ;
A[count] = v;
}


} //for

参考了 :算法导论 和 Algorithm Design Techniques and Analysis 。


  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(8)

随笔档案

文章档案

Friends

OJ

搜索

  •  

最新评论

阅读排行榜

评论排行榜