求这张动态图出处图。

大家正在求推荐
&·&·&·&·&·&·
(42人参加)
(110人参加)
(35人参加)
(35人参加)
(695人参加)
(410人参加)
(116人参加)
(20人参加)
第三方登录:1105人阅读
试题 - 算法/数据结构(15)
题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。
1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);
2. 通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由深度优先生成树可得出两类割点的特性:
&&&& (1)若生成树的根有两棵或两棵以上的子树,则此根顶点必为割点。因为图中不存在连接不同子树顶点的边,若删除此节点,则树便成为森林;
&&&& (2)若生成树中某个非叶子顶点V,其某棵子树的根和子树中的其他节点均没有指向V的祖先的回边,则V为割点。因为删去v,则其子树和图的其它部分被分割开来。
仍然利用深搜算法,只不过在这里定义visited[v]表示为深度优先搜索遍历图时访问顶点v的次序号,定义low[v]=Min{visited[v],low[w],visited[k]},其中w是顶点v在深度优先生成树上的孩子节点;k是顶点v在深度优先生成树上由回边联结的祖先节点。
&& 割点判定条件:如果对于某个顶点v,存在孩子节点w且low[w]&=visited[v],则该顶点v必为关节点。因为当w是v的孩子节点时,low[w]&=visited[v],表明w及其子孙均无指向v的祖先的回边,那么当删除顶点v后,v的孩子节点将于其他节点被分割开来,从来形成新的连通分量。
#include &iostream&
#include &string&
#include &queue&
#define MAXN 100
struct ArcNode
//边到的顶点
struct VNode
ArcNode *firstA
typedef VNode AdjList[MAXN];
struct Graph
int vertexN
int Locate(Graph g,string str)
for(int i = 0;i&g.vertexNi++)
if(str == g.vertexs[i].data)
return -1;
void Create(Graph &g)
string start,
cout && &请输入顶点和边数:&&&
cin&&g.vertexNum&&g.arcN
for(int i = 0;i&g.vertexNi++)
cout&&&请输入第&&&i&&&个顶点:&&&
cin&&g.vertexs[i].
g.vertexs[i].firstArc = NULL;
for(int i = 0;i &g.arcNi++)
cout&&&请输入第&&&i&&&条边的起始和结束顶点&&&
cin&&start&&
int m = Locate(g,start);
int n = Locate(g,end);
ArcNode *node = new ArcN
node-&adjVertex =
node-&next = g.vertexs[m].firstA
g.vertexs[m].firstArc =
ArcNode *node1 = new ArcN
node1-&adjVertex =
node1-&next = g.vertexs[n].firstA
g.vertexs[n].firstArc = node1;
void Print(Graph g)
for(int i = 0;i&g.vertexNi++)
cout && g.vertexs[i].
ArcNode *p = g.vertexs[i].firstA
cout&&&--&&&&g.vertexs[p-&adjVertex].
int FirstAdjVex(Graph g,int v)//返回v的第一个邻接顶点序号
ArcNode *p = g.vertexs[v].firstA
if(p!= NULL)
return p-&adjV
return -1;
int NextAdjVex(Graph g,int v,int w) //返回顶点v相对于w的下一个邻接点的序号
ArcNode *p = g.vertexs[v].firstA
if(p-&adjVertex == w)
if(p-&adjVertex !=w || !p-&next)
return -1;
return p-&next-&adjV
int countN;
int visted[MAXN];
int low[MAXN];
void DFSCutPoint(Graph g,int v0)
int min = 0,w;
visted[v0] = min = ++countN;;//v0是第count个访问的顶点,min的初值为visited[v0],即v0的访问次序
for(ArcNode *p = g.vertexs[v0].firstAp;p=p-&next)
w = p-&adjV
if(!visted[w])
DFSCutPoint(g,w);//从第w个顶点出发深搜,查找并输出关节点(割点),返回前求得low[w]
if(low[w] & min)//如果v0的孩子节点w的low[]小,说明孩子节点还与其他节点(祖先)相邻
min = low[w];
if(low[w]&=visted[v0] ) //v0的孩子节点w只与v0相连,则v0是关节点(割点)
cout&&g.vertexs[w].data&&& &;
else if(visted[w] & min)//w已访问,则w是v0生成树上祖先,它的访问顺序必小于min
min =visted[w];
low[v0] =//low[v0]取三者最小值
void FindCutPoint(Graph g)
visted[0] =
for(int i = 1;i&g.vertexNi++)
visted[i] =
ArcNode *p=g.vertexs[0].firstA
int v = p-&adjV
DFSCutPoint(g,v);
if(countN & g.vertexNum)
cout && g.vertexs[0].data&&& &;
while(p-&next)
v = p-&adjV
if(!visted[v])
DFSCutPoint(g,v);
int main()
Create(g);
cout&&&割点如下: &&&
FindCutPoint(g);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:665142次
积分:4548
积分:4548
排名:第3735名
原创:49篇
评论:151条
谢谢大家的关注和支持,大家一起学习。
新浪微博:
文章:14篇
阅读:219775
阅读:215935
(1)(1)(4)(10)(15)(6)(17)(4)求这张图的高清图片_百度知道
求这张图的高清图片
提问者采纳
681 x 1428
提问者评价
太给力了,你的回答完美解决了我的问题!
来自团队:
其他类似问题
为您推荐:
高清图片的相关知识
其他2条回答
高清估计没有,,你去百度图里面找其他墙纸吧《家庭教师reborn》名字
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您的举报已经提交成功,我们将尽快处理,谢谢!
你是图片太大的缘故
首先登陆您的新浪空间
在左侧点击【送礼物】进入,选择【收到的礼物】即可看到近期您的好友送你的礼物。
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'

我要回帖

更多关于 求这张动态图出处 的文章

 

随机推荐