图的广度遍历优先遍历有什么用

深度和广度优先_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
44页免费5页免费6页1下载券4页免费7页免费12页2下载券5页免费2页免费7页1下载券4页2下载券
喜欢此文档的还喜欢25页免费3页免费5页免费2页免费3页免费
深度和广度优先|数​据​结​构​课​程​设​计​类​文​件
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢您现在的位置: &
图 - 图的遍历 - 广度优先遍历 (二)
图 - 图的遍历 - 广度优先遍历 (二)
  (2)邻接矩阵表示的图的广度优先搜索算法
  void BFSM(MGraph *G,int k)
  {以v k 为源点对用邻接矩阵表示的图G进行广度优先搜索
  int i,j;
  CirQueue Q;
  InitQueue(&Q);
  printf("visit vertex:%c",G-&vexs[k]); //访问源点v k
  visited[k]=TRUE;
  EnQueue(&Q,k);
  while(!QueueEmpty(&Q)){
  i=DeQueue(&Q); //v i 出队
  for(j=0;jn;j++)//依次搜索v i 的邻接点v j
  if(G-&edges[i][j]==1&&!visited[j]){//v i 未访问
  printf("visit vertex:%c",G-&vexs[j]);//访问v i
  visited[j]=TRUE;
  EnQueue(&Q,j);//访问过的v i 人队
  }//endwhile
  }//BFSM
  (3) 广度优先遍历算法
  类似于DFSTraverse。【参见DFSTraverse算法】
  4、图的广度优先遍历序列
  广度优先遍历图所得的顶点序列,定义为图的广度优先遍历序列,简称BFS序列。
  (1)一个图的BFS序列不是惟一的
  (2)给定了源点及图的存储结构时,算法BFS和BFSM所给出BFS序列就是惟一的。
  【例】下图中G 7 以邻接矩阵为存储结构,以v 0 为出发点的BFS搜索过程【 参见动画演示 】和BFS序列为V 0 ,V 1 ,V 3 ,V
  4 ,V 2 ,V 6 ,V 5 ,V 7
  【例】上图中G 7 以邻接表为存储结构,以v 0 为出发点的BFS搜索过程和BFS序列【 参见动画演示 】
  5、算法分析
  对于具有n个顶点和e条边的无向图或有向图,每个顶点均入队一次。广度优先遍历(BFSTraverse)图的时间复杂度和
  DFSTraverse算法相同。
  当图是连通图时,BFSTraverse算法只需调用一次BFS或BFSM即可完成遍历操作,此时BFS和BFSM的时间复杂度分别为O(n+e)和
  0(n 2 )。
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-求用C++实现图的深度优先遍历或广度优先遍历
求用C++实现图的深度优先遍历或广度优先遍历 50
要求输出每个分支节点的访问次序并统计分支数
要求文件输入,Node.txt文件第一行是节点总数,后面每一行是节点编号;Link.txt文件第一行是链路总数,后面每行三个值,第一个是链路编号,第二三个是分别是链路两端的节点
不区分大小写匿名
相关知识等待您来回答
编程领域专家图的深度和广度优先遍历_百度知道
图的深度和广度优先遍历
题目描述给定一个无向连通图,顶点编号从0到n-1,用深度优先搜索(DFS)和广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历)输入第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,0<t<k),表示有m条边,k个顶点,t为遍历的起始顶点。 下面的m行,每行是空格隔开的两个整数u,v,表示一条连接u,v顶点的无向边。输出两行,每行为用空格隔开的k个整数,对应一组数据,分别表示DFS和BFS的遍历结果。样例输入6 7 00 30 41 41 52 32 43 5样例输出0 3 2 4 1 50 3 4 2 5 1提示分别用邻接矩阵和邻接表实现做好了最少追加50分,决不食言,急需啊,谢谢各位大大了
提问者采纳
#include&iostream&#define elemtype intconst int n=8;//图中顶点数 const int e=15;// 图中的边数 const int max=1000;int visited[n+1];//访问标志数组,为0表示未访问,为1表示已访问 int dist[n];//dist[i]存放从v到顶点i的最短路径struct graph{//定义图的数据类型
elemtype v[n+1];//存放顶点信息v1,v2。。。vn,不使用v[0]存储空间
int arcs[n+1][n+1];//邻接矩阵 //权值 };int path[n];// path[i]存放在最短路径上从顶点i到前一点的顶点号
//该数组的作用是各点到指定始点的路径链成一条仿真链int s[n];//s[i]=1表示顶点i的最短路径已经求出,s[i]=0表示未求出void creat(){ //建立邻接矩阵
int i,j,k,w;
cout&&&请输入&&&n&&&个顶点信息&&&
for(k=1;k&=n;k++)
cin&&g.v[k];
for(i=1;i&=n;i++)
for(j=1;j&=n;j++)
g.arcs[i][j];
for(k=1;k&=e;k++){
cout&&&请输入第&&&k&&&条边,共&&&e&&&条边&;
cin&&i&&j;
g.arcs[i][j]=1;
g.arcs[j][i]=1;
void dfs(int i, graph g){//从顶点i出发进行深度优先搜索遍历
cout&&g.v[i]&&& &;
visited[i]=1;
for(j=1;j&=n;j++)
if(g.arcs[i][j]==1&&!visited[j])
}void bfs(int i, graph g){//从顶点i出发进行广度优先搜索遍历
int q[n+1];//q为队列
int f,r,j;//f、r分别为队头、队尾指针
f=r=0;//初始化队列
cout&&g.v[i]&&& &;//输出访问顶点
visited[i]=1;//标记已访问的顶点
r++;q[r]=i;//入队
while(f&r){
f++;i=q[f];//出队列
for(j=1;j&=n;j++)
if((g.arcs[i][j]==1&&!visited[j])){
cout&&g.v[j]&&& &;
visited[j]=1;
r++;q[r]=j;//入队列
void shortestpath(const int v, graph g){ int i, j, k ,wm,
for(i=0;i&n;i++)
//按网的邻接矩阵确定各顶点最短路径的初值
{dist[i]= g.arcs[v][i];
if (i!=v && dist[i]&max) path[i]= else path[i]= -1;
s[v]=1; dist[v]=0;
//将顶点v本身排除在外
for(k=0;k&n-1;k++)
//求其他n-1个顶点的最短路径
{ wm= j=v;
for(i=0;i&n;i++)
//确定当前最短路径wm及顶点的序号J
if (!s[i] && dist[i] & wm)
{j=i;wm= dist[i];}
for(i=0;i&n;i++) //更新未确定最短路径各顶点的当前最短路径
if (!s[i] && dist[j] + g.arcs[j][i]& dist[i])
{dist[i] = dist[j] +g.arcs[j][i];
int main(){
int i,j,v;
for(i=1;i&=n;i++){
for(j=1;j&=n;j++)
cout&&g.arcs[i][j]&&& &;
while(yn==1){
for(i=1;i&=n;i++)
visited[i]=0;
cout&&&请输入深度优先搜索开始访问的顶点:&;
cout&&&从&&&i&&&出发的深度优先搜索遍历序列为&&&
cout&&endl&&&继续进行深度优先搜索吗&;
while(yn==1){
for(i=1;i&=n;i++)
visited[i]=0;
cout&&&请输入广度优先搜索开始访问的顶点:&;
cout&&&从&&&i&&&出发的广度优先搜索遍历序列为&&&
cout&&endl&&&继续进行广度优先搜索吗&;
cout&&&请输入顶点v的值:&;
shortestpath(v,g);
cout&&dist[v];
system(&pause&); return 0;
提问者评价
先采纳了吧,有人帮做就不错,非常感谢
其他类似问题
广度优先遍历的相关知识
其他1条回答
1.显示图的邻接矩阵, 图的邻接表, 深度优先遍历, 广度优先遍历, 最小用C
实现的,希望对你有所帮助。 #include
怎么就一个#include就没了?
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁第六章图的习题解析
⑴ 设无向图G中顶点数为n,则图G至少有( )条边,至多有( )条边;若G为有向图,则至少有( )条边,至多有(
【解答】0,n(n-1)/2,0,n(n-1)
【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。
⑵ 任何连通图的连通分量只有一个,即是( )。
【解答】其自身
⑶ 图的存储结构主要有两种,分别是( )和( )。
【解答】邻接矩阵,邻接表
【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。
⑷ 已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为( )。
【解答】O(n+e)
【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。
⑸ 已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是( )。
【解答】求第j列的所有元素之和
⑹ 有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的( )。
【解答】出度
⑺ 图的深度优先遍历类似于树的( )遍历,它所用到的数据结构是( );图的广度优先遍历类似于树的(
)遍历,它所用到的数据结构是( )。
【解答】前序,栈,层序,队列
⑻ 对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(
),利用Kruskal算法求最小生成树的时间复杂度为( )。
【解答】O(n2),O(elog2e)
【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。
⑼ 如果一个有向图不存在( ),则该图的全部顶点可以排列成一个拓扑序列。
【解答】回路
⑽ 在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为( )。
【解答】vi, vj, vk
【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。
⑴ 在一个无向图中,所有顶点的度数之和等于所有边数的( )倍。
A 1/2 B 1 C 2 D 4
【分析】设无向图中含有n个顶点e条边,则 。
⑵ n个顶点的强连通图至少有(  )条边,其形状是( )。
A n B n+1 C n-1 D n&(n-1)
E 无回路   F 有回路   G 环状    H 树状
【解答】A,G
⑶ 含n 个顶点的连通图中的任意一条简单路径,其长度不可能超过( )。
A 1 B n/2 C n-1 D n
【分析】若超过n-1,则路径中必存在重复的顶点。
⑷ 对于一个具有n个顶点的无向图,若采用邻接矩阵存储,则该矩阵的大小是( )。
A n B (n-1)2 C n-1 D n2
⑸ 图的生成树(  ),n个顶点的生成树有( )条边。
A 唯一     B 不唯一    C 唯一性不能确定
D n E n +1 F n-1
【解答】C,F
⑹ 设无向图G=(V, E)和G' =(V', E' ),如果G' 是G的生成树,则下面的说法中错误的是( )。
A G' 为 G的子图 B G' 为 G的连通分量
C G' 为G的极小连通子图且V = V' D G' 是G的一个无环子图
【分析】连通分量是无向图的极大连通子图,其中极大的含义是将依附于连通分量中顶点的所有边都加上,所以,连通分量中可能存在回路。
⑺ G是一个非连通无向图,共有28条边,则该图至少有( )个顶点。
A 6 B 7 C 8 D 9
【分析】n个顶点的无向图中,边数e≤n(n-1)/2,将e=28代入,有n≥8,现已知无向图非连通,则n=9。
⑻ 最小生成树指的是( ) 。
A 由连通网所得到的边数最少的生成树
B 由连通网所得到的顶点数相对较少的生成树
C 连通网中所有生成树中权值之和为最小的生成树
D 连通网的极小连通子图
⑼ 判定一个有向图是否存在回路除了可以利用拓扑排序方法外,还可以用( )。
A 求关键路径的方法    B 求最短路径的方法
C 广度优先遍历算法    D 深度优先遍历算法
【分析】当有向图中无回路时,从某顶点出发进行深度优先遍历时,出栈的顺序(退出DFSTraverse算法)即为逆向的拓扑序列。
⑴ 一个有向图的邻接表和逆邻接表中的结点个数一定相等。
【解答】对。邻接表和逆邻接表的区别仅在于出边和入边,边表中的结点个数都等于有向图中边的个数。
⑵ 用邻接矩阵存储图,所占用的存储空间大小只与图中顶点个数有关,而与图的边数无关。
【解答】对。邻接矩阵的空间复杂度为O(n2),与边的个数无关。
⑶ 图G的生成树是该图的一个极小连通子图
【解答】错。必须包含全部顶点。
⑷ 无向图的邻接矩阵一定是对称的,有向图的邻接矩阵一定是不对称的
【解答】错。有向图的邻接矩阵不一定对称,例如有向完全图的邻接矩阵就是对称的。
⑸ 对任意一个图,从某顶点出发进行一次深度优先或广度优先遍历,可访问图的所有顶点。
【解答】错。只有连通图从某顶点出发进行一次遍历,可访问图的所有顶点。
⑹ 在一个有向图的拓扑序列中,若顶点a在顶点b之前,则图中必有一条弧。
【解答】错。只能说明从顶点a到顶点b有一条路径。
⑺ 若一个有向图的邻接矩阵中对角线以下元素均为零,则该图的拓扑序列必定存在。
【解答】对。参见第11题的证明。
1. n个顶点的无向图,采用邻接表存储,回答下列问题?br /&⑴ 图中有多少条边?
⑵ 任意两个顶点i和j是否有边相连?
⑶ 任意一个顶点的度是多少?
⑴ 边表中的结点个数之和除以2。
⑵ 第i个边表中是否含有结点j。
⑶ 该顶点所对应的边表中所含结点个数。
2.n个顶点的无向图,采用邻接矩阵存储,回答下列问题:
⑴ 图中有多少条边?
⑵ 任意两个顶点i和j是否有边相连?
⑶ 任意一个顶点的度是多少?
⑴ 邻接矩阵中非零元素个数的总和除以2。
⑵ 当邻接矩阵A中A[i][j]=1(或A[j][i]=1)时,表示两顶点之间有边相连。
⑶ 计算邻接矩阵上该顶点对应的行上非零元素的个数。
已知一个连通图如图6-6所示,试给出图的邻接矩阵和邻接表存储示意图,若从顶点v1出发对该图进行遍历,分别给出一个按深度优先遍历和广度优先遍历的顶点序列。
邻接矩阵表示如下:
深度优先遍历序列为:v1 v2 v3 v5 v4 v6
广度优先遍历序列为:v1 v2 v4 v6 v3 v5
邻接表表示如下:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 图的深度优先遍历 的文章

 

随机推荐