给定一个无向图的邻接矩阵的图,要怎么遍历(深度和广度遍历)这个矩阵图,求方法啊
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定一个无向图的邻接矩阵的图,要怎么遍历(深度和广度遍历)这个矩阵图,求方法啊相关的知识,希望对你有一定的参考价值。
由于没有认真学,所以压力山大
参考技术A //从第v个顶点出发递归地深度优先遍历图Gvoid DFS(MGraph G,int v)
int w;
visited[v] = TRUE;//设置访问标志为TRUE(已访问)
VisitFunc(G.vexs[v]);//访问第v个顶点
for (w=FirstAdjVex(G,G.vexs[v]); w>=0; w=NextAdjVex(G,G.vexs[v],G.vexs[w]))
if (! visited[w])
DFS(G,w);//对v的尚未访问的序号为w的邻接顶点递归调用DFS
//初始条件:图G存在,Visit是顶点的应用函数
//操作结果:从第1个顶点起,深度优先遍历图G,并对每个顶点调用函数Visit一次且仅一次
void DFSTraverse(MGraph G,void(* Visit)(VertexType))
int v;
VisitFunc = Visit;//使用全局变量VisitFunc,使DFS不必设函数指针参数
for (v=0; v<G.vexnum; ++v)
visited[v] = FALSE;//访问标志数组初始化(未被访问)
for (v=0; v<G.vexnum; ++v)
if (! visited[v])
DFS(G,v);//对尚未访问的顶点v调用DFS
printf("\n");
//操作结果:从第1个顶点起,按广度优先非递归遍历图G,并对每个顶点调用函数Visit一次且仅一次
void BFSTraverse(MGraph G,void(* Visit)(VertexType))
int v,u,w;
LinkQueue Q;//使用辅助队列Q和访问标志数组visited
for (v=0; v<G.vexnum; ++v)
visited[v] = FALSE;//置初值
InitQueue(&Q);//置空的辅助队列Q
for (v=0; v<G.vexnum; ++v)
if (! visited[v])//v尚未访问
visited[v] = TRUE;//设置访问标志为TRUE(已访问)
Visit(G.vexs[v]);
EnQueue(&Q,v);//v入队列
while (! QueueEmpty(Q))//队列不空
DeQueue(&Q,&u);//队列元素出队并置为u
for (w=FirstAdjVex(G,G.vexs[u]); w>=0; w=NextAdjVex(G,G.vexs[u],G.vexs[w]))
if (! visited[w])//w为u的尚未访问的邻接顶点的序号
visited[w] = TRUE;
Visit(G.vexs[w]);
EnQueue(&Q,w);
//while
//for (v=0...)
printf("\n");
参考技术B 不要程序,请说明原理!!
pintia刷题记录——图
1.遍历的定义:图的遍历是从给定的源点出发每一个顶点仅被访问一次。
2.图的深度遍历是一个递归过程。
3.图的深度遍历适用于有向图。
4.广度遍历不止适于无向图。
5.在用邻接表表示有N个结点E条边的图时,深度优先遍历算法的时间复杂度为o(n+e)。
6.图深度遍历即二叉树先序遍历,广度遍历即层次遍历。
7.如果从无向图的任一顶点出发进行一次深度优先搜索可访问所有顶点,则该图一定是连通图。
8.一题搞懂邻接表和深度遍历:
9.有点小疑问,但是对了:
10.用邻接表表示图进行深度优先遍历时,通常借助栈来实现算法。广度则是队列。
11.我是有疑问的
12.如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则下列说法中不正确的是一定有回路。
解析:一个广搜一个连通分量,可能有两个连通分量。
13.邻接表和广度优先算法的结合:
14.前面一个题的广度版本
15.任何一个带权无向连通图的最小生成树——有一颗或多颗。
16.算最小生成树时,prim适于稠密图,克里斯卡尔适于稀疏图。
以上是关于给定一个无向图的邻接矩阵的图,要怎么遍历(深度和广度遍历)这个矩阵图,求方法啊的主要内容,如果未能解决你的问题,请参考以下文章