用创建邻接表表表示图的广度优先搜索时的存储结构,通常采用()结构来实现算法

已知有N个结点的无向图,采用邻接表结构存储,要求编写算法实现广度优先搜索策略遍历图中所有顶点。_百度知道
已知有N个结点的无向图,采用邻接表结构存储,要求编写算法实现广度优先搜索策略遍历图中所有顶点。
提问者采纳
&#47.;访问vEnQueue(&Q,void(* Visit)(char *)){if }//队头元素出队并置为ufor (p=G;/设v为已被访问Visit(G;/&#47! visited[p-&/&#47,u;&#47.data);置初值为未被访问}InitQueue(&Q);如果是连通图;p指向表结点LinkQueue Q;//ArcNode * p.vexnum,v);/ v&G;//u的邻接顶点尚未被访问{visited[p-&G;队列不空{DeQueue(&Q; ++v)/&#47! QueueEmpty(Q))/链队列类型for (v=0.data);/&#47.;/访问该邻接顶点EnQueue(&Q;//入队该邻接顶点序号}}}/while }&#47.;next)/for(v=;&#47。使用辅助队列Q和访问标志数组visited,p-&gt.adjvex] = TRUE.)printf(&quot. p.adjvex])/按广度优先非递归遍历图G;/&#47,&u);&#47,只v=0就遍历全图{if (.;v尚未被访问{visited[v] = TRUE! visited[v])/初始化辅助队列Qfor (v=0.adjvex);//data.vertices[p-& v&/&#47.vertices[v];v入队while (;)./&#47.vertices[u].仅适用于邻接表结构void BFSTraverse1(ALGraph G;p依次指向u的邻接顶点{if (.adjvex];该邻接顶点设为已被访问Visit(G;n&&#47.;&#92// p=p-& ++v){visited[v] = FALSE
提问者评价
其他类似问题
邻接表的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
数据结构第7章_图_答案
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口  一、广度优先搜索
  广度优先搜索(BFS)是最简单的图搜索算法之一,也是很多重要的图算法的原型。在Prim最小生成树算法和Dijkstra单源最短路径算法中,都采用了与广度优先搜索类似的思想。
  在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期发现可以从s到达的所有顶点,并计算s到所有这些可达顶点之间的距离(即最少的边数)。该搜索算法同时还能生成一棵根为s、且包括所有s的可达顶点的广度优先树 。对从s可达的任意顶点v,广度优先树中从s到v的路径对应于图G中从s到v的一条最短路径 ,即包含最少边数的路径。该算法对有向图和无向图同样适用。之所以称为广度优先搜索,是因为它始终是将已发现和未发现顶点之间的边界,沿其广度方向向外扩展。亦即,算法首先发现和s距离为k的所有顶点,然后才会发现和s距离为k+1的其他顶点。
  在广度优先搜索中,我们首先要注意一个顶点的3种状态:
  已到达(已访问)但还未考察 :表示当前搜索到的这个顶点,接下来要对这个顶点进行分析。
  正在考察 :已经到达了这个顶点,但是它的相邻顶点还没有完全被访问到,称为未考察完成。采用队列存储未被考察的顶点。
  已考察 :已经到达了这个顶点,且它的所有相邻顶点都已经被访问完成,则称该顶点已考察。
  具体步骤如下:
  (1)从顶点s开始,标记它为已访问,将其压入队列中;
  (2)这时,顶点s的的相邻顶点还未被访问,所以s暂时还为未考察状态;
  (3)访问它的所有相邻顶点,并将它们压入队列,之后s的状态变为已考察,将其从队列中删除;这些入队的顶点的父亲顶点即为s
  (4)取队头顶点,以其为起点重复进行以上操作。当所有的顶点都被考察完毕,即队列为空时,考察停止。
  由分析可知,广度优先搜索的总运行时间为O(V+E),为一个线性时间。
  最短路径 :源顶点为s,d[v]中保存从s到v的最短路径长度
  广度优先树 :过程BFS在搜索图的同时,也建立了一棵广度优先树,这棵树是用parent[]表示的,parent[v]表示的是顶点v的父亲结点。
  广度优先搜索C++(邻接表)实现:
  1 #define INF 9999
  2 bool visited[maxn]; //标记顶点是否被考察,初始置为false
  3 int d[maxn], parent[maxn]; //d[]记录最短路径长度,parent[]记录某结点的父亲结点,生成树
  4 void bfs(int s) //广度优先搜索,邻接表输入(详见“一、图的表示”)
  6 for(int i = 1; i &= i++) //初始化
  8 d[i] = INF;
  9 parent[i] = -1;
  10 visited[i] =
  12 visited[s] =
  13 d[s] = 0;
  14 queue //用STL队列实现 ,#include
  15 q.push(s); //压入队列
  16 while(!q.empty())
  18 int u = q.front(); //取队头元素
  19 arcnode * p = Ver[u].
  20 while(p != NULL) //遍历相邻顶点
  22 if(!visited[p-&vertex])
  24 q.push(p-&vertex); //压入队列
  25 parent[p-&vertex] = //指向父亲
  26 d[p-&vertex] = d[u]+1; //路径长+1
  27 visited[p-&vertex] = //置为已被考察
  29 p = p-&
  31 q.pop(); //出队列
  34 void PrintPath(int s, int v) //打印从s到v的最短路径,需先调用bfs(s)
  36 if(v == s)
  37 cout && s &&
  38 else if(parent[v] == -1)
  40 else
  42 PrintPath(s,parent[v]);
  43 cout && v &&
  View Code
  二、深度优先搜索
  深度优先搜索算法所遵循的搜索策略是尽可能“深”地搜索一个图。在深度优先搜索中,对于最新发现的顶点,如果它还有以此为起点而未探测到的边,就沿此边继续探测下去。当顶点v的所有边都已被探寻过后,搜索将回溯到发现顶点v有起始点的那些边。这一过程一直进行到已发现从源顶点可达的所有顶点时为止。如果还存在未被发现的顶点,则选择其中一个作为源顶点,并重复以上过程。整个过程反复进行,直到所有的顶点都已被发现为止。
  与广度优先搜索类似,在深度优先搜索中,每当扫描已发现顶点u的邻接表,从而发现新顶点v时,就将置v的父域parent[v]为u。与广度优先搜索不同的是,其先辈子图形成一棵树,深度优先搜索产生的先辈子图可以由几棵树所组成,因为搜索可能由多个源顶点开始重复进行。深度优先搜索的先辈子图形成了一个由数棵深度优先树所组成的深度优先森林 。
  除了创建一个深度优先森林外,深度优先搜索同时为每个顶点加盖时间戳。每个顶点v有两个时间戳:当顶点v第一次被发现时,记录下第一个时间戳 d[v],当结束检查v的邻接表时,记录下第二个时间戳f[v]。许多图的算法都用到了时间戳,它们对推算深度优先搜索的进行情况有很大帮助。首页 1
【】【】【】【】
ISBN编号:&8
出版时间:&2013-3
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&ISBN编号:&9
出版时间:&2013-4
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&
????????????
????????????
         Copyright ©
() All Rights Reserved数据结构答案(7,8,9章)3_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
13页免费10页免费7页免费16页免费32页免费4页免费81页1下载券144页1下载券4页免费19页免费
喜欢此文档的还喜欢20页2下载券20页2下载券12页免费35页免费29页1下载券
数据结构答案(7,8,9章)3|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢已知有N个结点的无向图,采用邻接表结构存储,要求编写算法实现广度优先搜索策略遍历图中所有顶点。_百度知道
已知有N个结点的无向图,采用邻接表结构存储,要求编写算法实现广度优先搜索策略遍历图中所有顶点。
提问者采纳
p=p-& Q-&gt,intv)
&#47.h&;;nextarc),flag=0; else
return -1;typedef struct{ QNode front,G;p1-&指向下一条边}ArcN for(i=0;\adjvex==w)
flag=1;void BFSTraverse(Graph G){&#47.firstarc)
returnG!\;&#47.h&gt.
q=(ArcNode *)malloc(sizeof(ArcNode));G-&++i)
if(G-&Please input the number of ArcNode!G-&printf(&quot,v2);elem!Q-&gt.data==v)
printf(&}Status QueueEmpty(Queue Q){ if(Q;节点的个数 intarcnum,k; p=G. ArcNode *p;;}Status CreateGraph(Graph *G){/);n&
printf(&quot,v1).返回v的第一个邻接顶点 if(G;i& p-&N/The Adjacency L返回节点v在图中的位置{n&v&
&#47,G-& if(Q-&}int NextAdjVex(Graph G,*q;w=NextAdjVex(G.firstarc)
G-&i&Please input the number of VN/n& else
return FALSE;}Q if(;p1=p1-&%d&
if(;front) exit(OVERFLOW);广度优先遍历=0;
{ for(q1=G-&gt,&v1);/ for(k=0,v1,v1;
&#47.rear-&adjvex); return OK.vertices[v],v2;
}}main(){Graph G;%d&#92,i;v%d& ArcNode *p1; /rear=p;,p-&front-&vexnum)
returni.data);vertices[i],v1;顶点信息 ArcNode*&}Status DeQueue(Queue *Q;#include&nextarc)
&#47,*q1.),int e){ QNode p=(QNode)malloc(sizeof(Node));arcnum=n,i;conio.firstarc=q;rear=(QNode)malloc(sizeof(Node));vertices[i]:&
/front-&gt,&v2); *e=p-& Q-&
if(;顶点信息
G-& if(.h&#include& else
return -1.data);&#47: &&nextarc=q; }
printf(&;该边所指向的顶点的位置 struct ArcNode *vexnum.vertices[v].data)!QueueEmpty(q))
DeQueue(&q;elem=e;i&}int Visited[MAX];++i) {
G-& printf(& InitQueue(&q):\
/边的条数}G指向第一条依附该节点的边的指针}VN顶点信息 printf(& p=Q-&
} }printf(&//Output the message of VN#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2#define NULL 0typedef int S&#47.vertices[i]!Visited[w])
Visited[w]=TRUE;q1-&;
/vertices[j];
if(i&n&}int LocateVex(Graph *G!G-&//
/adjvex=i;adjvex=j,G;}Node!p) exit(OVERFLOW);nextarc=NULL;vertices[i]; return OK;math,j;
p1-&nextarc);w&
EnQueue(&q; getch();
j=LocateVex(G;vexnum,*p:&adjvex);第一个顶点出对
for(w=FirstAdjVex(G;/
p-&G; else
return -1;++v)
if(;=0&&j&gt,n; } return OK; printf(&q1=q1-&front-&
while(p-& /G-&
printf(&返回v中相对于w的下一个邻接顶点 int flag=0;front=Q-&Please input the %dedge begv%d&#92,w))
if(;vertices[j];n& free(p);&#92.firstarc=NULL;vertices[i];vertices[j]; if(i& struct Node *以邻接表形式创建无向连通图G;);G-&/vexnum=m;定义一个队列 for(v=0.h&gt.firstarc)
G-&/);v&lt.vertices[v];
++/ / } if(flag &&p-&
p=(ArcNode *)malloc(sizeof(ArcNode)).rear==Q;rear=Q-&初始化队列 for(v=0;next=p-&表节点#define MAX 20typedef structArcNode
&#47,p-&gt!Visited[v])
Visited[v]=TRUE.data=i+1;
scanf(& p-&nBreadth First S头节点{ intadjvex,int *e){ QNnext=NULL,v);%d&;typedef struct Node{
i=LocateVex(G,AdjList[MAX];/第一个顶点入队
q-&nextarc-& QNnextarc=NULL#include&++v)
Visited[v]=FALSE;.vertices[w]; G-&gt,G-&#include&v%d &n&typedef structVNode
/vertices[i],v1);/表节点{ return OK;);
/ CreateGraph(&G);}Status EnQueue(Queue *Q;typedef struct{ AdjLG-&),&n),w,/vertices[i];Status InitQueue(Queue *Q){ Q-&gt,w); while(p) {
if(p-&gt.firstarc=p,&m),int v){/ Q-&rear==p)
Q-&边的数目 for(i=0,int w){&#47.data):\next=NULL; clrscr().front)
return TRUE;);next=p;顶点数目 G-&}int FirstAdjVex(Graph G;nextarc)
returnp-& Q-&gt.vertices[v];i&vertices[i]; for(i=0;输出邻接表 for(i=0;vertices[i]; scanf(&/++i)
printf(& scanf(&quot,k+1);/nextarc=p:\
for(p1=G-&gt,&v1;\/ Q
/ printf(&
EnQueue(&q.firstarc-&++i) {
printf(& BFSTraverse(G);t%dv%d-&&#47
采纳率100%
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 创建邻接表 的文章

 

随机推荐