6-2 邻接表存储图的广度优先遍历(20 分)

试实现邻接表存储图的广度优先遍历。

函数接口定义:

  1. void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );

其中LGraph是邻接表存储的图,定义如下:

  1. /* 邻接点的定义 */
  2. typedef struct AdjVNode *PtrToAdjVNode;
  3. struct AdjVNode{
  4. Vertex AdjV; /* 邻接点下标 */
  5. PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
  6. };
  7.  
  8. /* 顶点表头结点的定义 */
  9. typedef struct Vnode{
  10. PtrToAdjVNode FirstEdge; /* 边表头指针 */
  11. } AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
  12.  
  13. /* 图结点的定义 */
  14. typedef struct GNode *PtrToGNode;
  15. struct GNode{
  16. int Nv; /* 顶点数 */
  17. int Ne; /* 边数 */
  18. AdjList G; /* 邻接表 */
  19. };
  20. typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */

函数BFS应从第S个顶点出发对邻接表存储的图Graph进行广度优先搜索,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按邻接表顺序访问。题目保证S是图中的合法顶点。

裁判测试程序样例:

  1. #include <stdio.h>
  2.  
  3. typedef enum {false, true} bool;
  4. #define MaxVertexNum 10 /* 最大顶点数设为10 */
  5. typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
  6.  
  7. /* 邻接点的定义 */
  8. typedef struct AdjVNode *PtrToAdjVNode;
  9. struct AdjVNode{
  10. Vertex AdjV; /* 邻接点下标 */
  11. PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
  12. };
  13.  
  14. /* 顶点表头结点的定义 */
  15. typedef struct Vnode{
  16. PtrToAdjVNode FirstEdge; /* 边表头指针 */
  17. } AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
  18.  
  19. /* 图结点的定义 */
  20. typedef struct GNode *PtrToGNode;
  21. struct GNode{
  22. int Nv; /* 顶点数 */
  23. int Ne; /* 边数 */
  24. AdjList G; /* 邻接表 */
  25. };
  26. typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
  27.  
  28. bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
  29.  
  30. LGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
  31.  
  32. void Visit( Vertex V )
  33. {
  34. printf(" %d", V);
  35. }
  36.  
  37. void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );
  38.  
  39. int main()
  40. {
  41. LGraph G;
  42. Vertex S;
  43.  
  44. G = CreateGraph();
  45. scanf("%d", &S);
  46. printf("BFS from %d:", S);
  47. BFS(G, S, Visit);
  48.  
  49. return ;
  50. }
  51.  
  52. /* 你的代码将被嵌在这里 */

输入样例:给定图如下

  1. 2

输出样例:

  1. BFS from 2: 2 0 3 5 4 1 6
  1. void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) )
  2. {
  3. int queue[1010];
  4. int l=0,r=0;
  5. queue[r++]=S;
  6. (*Visit)(S);
  7. Visited[S]=true;
  8. PtrToAdjVNode tmp;
  9. while(l!=r)
  10. {
  11. tmp=Graph->G[queue[l++]].FirstEdge;
  12. while(tmp)
  13. {
  14. Vertex pos=tmp->AdjV;
  15. if(!Visited[pos])
  16. {
  17. Visit(pos);
  18. Visited[pos]=true;
  19. queue[r++]=pos;
  20. }
  21. tmp=tmp->Next;
  22. }
  23. }
  24. }

  

  1.  

PTA 邻接表存储图的广度优先遍历(20 分)的更多相关文章

  1. PTA 邻接表存储图的广度优先遍历

    试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...

  2. 邻接表存储图,DFS遍历图的java代码实现

    import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...

  3. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  4. c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)

    一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...

  5. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  6. 数据结构之---C语言实现图的邻接表存储表示

    // 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...

  7. 图的邻接表存储表示(C)

    //---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...

  8. 图的邻接表存储 c实现

    图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...

  9. PTA 邻接矩阵存储图的深度优先遍历

    6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...

随机推荐

  1. LeetCode & Q13-Roman to Integer-Easy

    Math String Description: Given a roman numeral, convert it to an integer. Input is guaranteed to be ...

  2. 用anaconda安装最新的TensorFlow版本

    Google发布了TensorFlow1.4正式版 在anaconad搜索依旧是1.2的版本,通过一番查阅,找到了方法 1,打开anaconda-prompt 2,激活你要安装的环境 activate ...

  3. 前端基础之html-Day12

    1.web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bi ...

  4. kubernetes入门(10)kubernetes单机安装后 - helloworld

    前言 查看端口是否被监听了 ::netstat -tlp |grep 31002 我是用的yum install etcd kubernetes docker vim, 这样装的是1.5.2,不是最新 ...

  5. 新概念英语(1-35)Our village

    新概念英语(1-35)Our village Are the children coming out of the park or going into it ? This is a photogra ...

  6. SQL执行计划分析

    explain执行计划中的字段以及含义在下面的博客中有详细讲述: https://blog.csdn.net/da_guo_li/article/details/79008016 执行计划能告诉我们什 ...

  7. setInterval()使用时易疏忽的点

    举个例子: 一道题目 这两个程序的区别就在于我向setInterval的参数一function写入了参数.这就是导致运行结果不尽如人意的原因. setInterval()方法可以接收三个参数,此参数会 ...

  8. Linux:sheel脚本for的用法,及日期参数+1day用法

    记录下shell的for的用法,及参数是日期的情况下,该日期+1day的用法: #!/usr/bin/env bash source /app/catt/login.sh p_days="2 ...

  9. SpringMVC(十):SpringMVC 处理输出模型数据之Map及Model

    Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...

  10. js分页效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...