PTA 邻接表存储图的广度优先遍历(20 分)
6-2 邻接表存储图的广度优先遍历(20 分)
试实现邻接表存储图的广度优先遍历。
函数接口定义:
- void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );
其中LGraph
是邻接表存储的图,定义如下:
- /* 邻接点的定义 */
- typedef struct AdjVNode *PtrToAdjVNode;
- struct AdjVNode{
- Vertex AdjV; /* 邻接点下标 */
- PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
- };
- /* 顶点表头结点的定义 */
- typedef struct Vnode{
- PtrToAdjVNode FirstEdge; /* 边表头指针 */
- } AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
- /* 图结点的定义 */
- typedef struct GNode *PtrToGNode;
- struct GNode{
- int Nv; /* 顶点数 */
- int Ne; /* 边数 */
- AdjList G; /* 邻接表 */
- };
- typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
函数BFS
应从第S
个顶点出发对邻接表存储的图Graph
进行广度优先搜索,遍历时用裁判定义的函数Visit
访问每个顶点。当访问邻接点时,要求按邻接表顺序访问。题目保证S
是图中的合法顶点。
裁判测试程序样例:
- #include <stdio.h>
- typedef enum {false, true} bool;
- #define MaxVertexNum 10 /* 最大顶点数设为10 */
- typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
- /* 邻接点的定义 */
- typedef struct AdjVNode *PtrToAdjVNode;
- struct AdjVNode{
- Vertex AdjV; /* 邻接点下标 */
- PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
- };
- /* 顶点表头结点的定义 */
- typedef struct Vnode{
- PtrToAdjVNode FirstEdge; /* 边表头指针 */
- } AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
- /* 图结点的定义 */
- typedef struct GNode *PtrToGNode;
- struct GNode{
- int Nv; /* 顶点数 */
- int Ne; /* 边数 */
- AdjList G; /* 邻接表 */
- };
- typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
- bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
- LGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
- void Visit( Vertex V )
- {
- printf(" %d", V);
- }
- void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );
- int main()
- {
- LGraph G;
- Vertex S;
- G = CreateGraph();
- scanf("%d", &S);
- printf("BFS from %d:", S);
- BFS(G, S, Visit);
- return ;
- }
- /* 你的代码将被嵌在这里 */
输入样例:给定图如下
2
输出样例:
BFS from 2: 2 0 3 5 4 1 6
- void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) )
- {
- int queue[1010];
- int l=0,r=0;
- queue[r++]=S;
- (*Visit)(S);
- Visited[S]=true;
- PtrToAdjVNode tmp;
- while(l!=r)
- {
- tmp=Graph->G[queue[l++]].FirstEdge;
- while(tmp)
- {
- Vertex pos=tmp->AdjV;
- if(!Visited[pos])
- {
- Visit(pos);
- Visited[pos]=true;
- queue[r++]=pos;
- }
- tmp=tmp->Next;
- }
- }
- }
PTA 邻接表存储图的广度优先遍历(20 分)的更多相关文章
- PTA 邻接表存储图的广度优先遍历
试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...
- 邻接表存储图,DFS遍历图的java代码实现
import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)
一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 数据结构之---C语言实现图的邻接表存储表示
// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...
- 图的邻接表存储表示(C)
//---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...
- 图的邻接表存储 c实现
图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...
- PTA 邻接矩阵存储图的深度优先遍历
6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...
随机推荐
- LeetCode & Q13-Roman to Integer-Easy
Math String Description: Given a roman numeral, convert it to an integer. Input is guaranteed to be ...
- 用anaconda安装最新的TensorFlow版本
Google发布了TensorFlow1.4正式版 在anaconad搜索依旧是1.2的版本,通过一番查阅,找到了方法 1,打开anaconda-prompt 2,激活你要安装的环境 activate ...
- 前端基础之html-Day12
1.web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bi ...
- kubernetes入门(10)kubernetes单机安装后 - helloworld
前言 查看端口是否被监听了 ::netstat -tlp |grep 31002 我是用的yum install etcd kubernetes docker vim, 这样装的是1.5.2,不是最新 ...
- 新概念英语(1-35)Our village
新概念英语(1-35)Our village Are the children coming out of the park or going into it ? This is a photogra ...
- SQL执行计划分析
explain执行计划中的字段以及含义在下面的博客中有详细讲述: https://blog.csdn.net/da_guo_li/article/details/79008016 执行计划能告诉我们什 ...
- setInterval()使用时易疏忽的点
举个例子: 一道题目 这两个程序的区别就在于我向setInterval的参数一function写入了参数.这就是导致运行结果不尽如人意的原因. setInterval()方法可以接收三个参数,此参数会 ...
- Linux:sheel脚本for的用法,及日期参数+1day用法
记录下shell的for的用法,及参数是日期的情况下,该日期+1day的用法: #!/usr/bin/env bash source /app/catt/login.sh p_days="2 ...
- SpringMVC(十):SpringMVC 处理输出模型数据之Map及Model
Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...
- js分页效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...