图的广度优先遍历和树的层序遍历相似,伪代码见下图:

(以上图片来自网络)

#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>
#define MaxVertexNum 100    /* 最大顶点数设为100 */
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 */  bool Visited[MaxVertexNum];
/*****/
typedef  Vertex Ele;
typedef struct QNode{
Ele data[MaxVertexNum];
int front,rear;
}*Queue;
Queue createQueue(){
Queue q=(Queue)malloc(sizeof(struct QNode));
q->front=q->rear=-1;return q;
}
bool isempty(Queue q){return q->rear==q->front;
}
bool isfull(Queue q){return (q->rear+1)%MaxVertexNum==q->front;}
void add(Queue q,Ele e){
if(isfull(q)){printf("Queue is full\n");return;}
q->data[++q->rear]=e;
}Ele del(Queue q){
if(isempty(q)){printf("Queue is empty\n");return -1;}return q->data[++q->front];
}
/***//* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{  Vertex V1, V2;      /* 有向边<V1, V2> */  WeightType Weight;  /* 权重 */
};
typedef PtrToENode Edge;  /* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{  Vertex AdjV;        /* 邻接点下标 */  WeightType Weight;  /* 边权重 */  PtrToAdjVNode Next;    /* 指向下一个邻接点的指针 */
};  /* 顶点表头结点的定义 */
typedef struct Vnode{  PtrToAdjVNode FirstEdge;/* 边表头指针 */  DataType Data;            /* 存顶点的数据 */  /* 注意:很多情况下,顶点无数据,此时Data可以不用出现 */
} AdjList[MaxVertexNum];    /* AdjList是邻接表类型 */  /* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{    int Nv;     /* 顶点数 */  int Ne;     /* 边数   */  AdjList G;  /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */  LGraph CreateGraph( int VertexNum )
{ Vertex V;
/* 初始化一个有VertexNum个顶点但没有边的图 */
LGraph Graph=(LGraph)malloc(sizeof(struct GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;/* 初始化邻接表头指针 */  /* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */  for (V=0; V<Graph->Nv; V++)  Graph->G[V].FirstEdge = NULL;  return Graph;
} void InsertEdge( LGraph Graph, Edge E )  {PtrToAdjVNode NewNode;  /* 插入边 <V1, V2> */  /* 为V2建立新的邻接点 */  NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));  NewNode->AdjV = E->V2;  NewNode->Weight = E->Weight;  /* 将V2插入V1的表头 */  NewNode->Next = Graph->G[E->V1].FirstEdge;  Graph->G[E->V1].FirstEdge = NewNode;  /* 若是无向图,还要插入边 <V2, V1> */  /* 为V1建立新的邻接点 */  NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));  NewNode->AdjV = E->V1;  NewNode->Weight = E->Weight;  /* 将V1插入V2的表头 */  NewNode->Next = Graph->G[E->V2].FirstEdge;  Graph->G[E->V2].FirstEdge = NewNode;  }LGraph BuildGraph()  {  LGraph Graph;  Edge E;  Vertex V;  int Nv, i;  scanf("%d", &Nv);   /* 读入顶点个数 */  Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */   scanf("%d", &(Graph->Ne));   /* 读入边数 */  if ( Graph->Ne != 0 ) { /* 如果有边 */   E = (Edge)malloc( sizeof(struct ENode) ); /* 建立边结点 */   /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */  for (i=0; i<Graph->Ne; i++) {  scanf("%d %d %d", &E->V1, &E->V2, &E->Weight);   /* 注意:如果权重不是整型,Weight的读入格式要改 */  InsertEdge( Graph, E );  }  free(E);}   /* 如果顶点有数据的话,读入数据 */  for (V=0; V<Graph->Nv; V++)   scanf(" %c", &(Graph->G[V].Data));  return Graph;  }  /* 邻接表存储的图 - DFS */void Visit( Vertex V ){printf("正在访问顶点%d\n", V);}/* Visited[]为全局变量,已经初始化为false */void BFS( LGraph Graph, Vertex V, void (*PVisit)(Vertex) ){   /* 以V为出发点对邻接表存储的图Graph进行BFS搜索 */PtrToAdjVNode W;Queue q=createQueue();(*PVisit)( V ); /* 访问第V个顶点 */Visited[V] = true; /* 标记V已访问 */add(q,V);while(!isempty(q)) {V=del(q);for(W=Graph->G[V].FirstEdge;W;W=W->Next)if ( !Visited[W->AdjV] )    /* 若W->AdjV未被访问 */{(*PVisit)(W->AdjV);Visited[W->AdjV]=true;add(q,W->AdjV); }}}int main(){for(int i=0;i<MaxVertexNum;i++)Visited[i]=false;//初始化为falseLGraph Graph=BuildGraph();BFS(Graph,0,Visit);return 0;}
#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>
#define MaxVertexNum 100    /* 最大顶点数设为100 */
#define INFINITY 65535        /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 */
/*****/
typedef  Vertex Ele;
typedef struct QNode{
Ele data[MaxVertexNum];
int front,rear;
}*Queue;
Queue createQueue(){
Queue q=(Queue)malloc(sizeof(struct QNode));
q->front=q->rear=-1;return q;
}
bool isempty(Queue q){return q->rear==q->front;
}
bool isfull(Queue q){return (q->rear+1)%MaxVertexNum==q->front;}
void add(Queue q,Ele e){
if(isfull(q)){printf("Queue is full\n");return;}
q->data[++q->rear]=e;
}Ele del(Queue q){
if(isempty(q)){printf("Queue is empty\n");return -1;}return q->data[++q->front];
}
/***/
bool Visited[MaxVertexNum];
/* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{  Vertex V1, V2;      /* 有向边<V1, V2> */  WeightType Weight;  /* 权重 */
};
typedef PtrToENode Edge;  /* 图结点的定义 */
typedef struct GNode *PtrToGNode;
struct GNode{  int Nv;  /* 顶点数 */  int Ne;  /* 边数   */  WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */  DataType Data[MaxVertexNum];      /* 存顶点的数据 */  /* 注意:很多情况下,顶点无数据,此时Data[]可以不用出现 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */  MGraph CreateGraph( int VertexNum )
{ /* 初始化一个有VertexNum个顶点但没有边的图 */  Vertex V, W;  MGraph Graph;  Graph = (MGraph)malloc(sizeof(struct GNode)); /* 建立图 */  Graph->Nv = VertexNum;  Graph->Ne = 0;  /* 初始化邻接矩阵 */  /* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */  for (V=0; V<Graph->Nv; V++)  for (W=0; W<Graph->Nv; W++) if(V==W) Graph->G[V][W]=0;else  Graph->G[V][W] = INFINITY;  return Graph;
}  void InsertEdge( MGraph Graph, Edge E )  {/* 插入边 <V1, V2> */  Graph->G[E->V1][E->V2] = E->Weight;      /* 若是无向图,还要插入边<V2, V1> */  Graph->G[E->V2][E->V1] = E->Weight;  }MGraph BuildGraph()  {  MGraph Graph;  Edge E;  Vertex V;  int Nv, i;  scanf("%d", &Nv);   /* 读入顶点个数 */  Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */   scanf("%d", &(Graph->Ne));   /* 读入边数 */  if ( Graph->Ne != 0 ) { /* 如果有边 */   E = (Edge)malloc(sizeof(struct ENode)); /* 建立边结点 */   /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */  for (i=0; i<Graph->Ne; i++) {  scanf("%d %d %d", &E->V1, &E->V2, &E->Weight);   /* 注意:如果权重不是整型,Weight的读入格式要改 */  InsertEdge( Graph, E );  }  free(E);}   /* 如果顶点有数据的话,读入数据 */  for (V=0; V<Graph->Nv; V++)   scanf(" %c", &(Graph->Data[V]));  return Graph;  }  void Visit( Vertex V ){printf("正在访问顶点%d\n", V);}/* Visited[]为全局变量,已经初始化为false */void BFS( MGraph Graph, Vertex V, void (*PVisit)(Vertex) ){Queue q=createQueue();/* 以V为出发点对邻接表存储的图Graph进行BFS搜索 */(*PVisit)( V ); /* 访问第V个顶点 */Visited[V] = true; /* 标记V已访问 */add(q,V);while(!isempty(q)){V=del(q);for(Vertex W=0;W<Graph->Nv;W++){if(W!=V&&Graph->G[V][W]!=INFINITY&&!Visited[W])/* 若W是V的邻接点并且未访问过 */{(*PVisit)( W); /* 访问第W个顶点 */Visited[W] = true; /* 标记W已访问 */add(q,W);}}}}int main(){for(int i=0;i<MaxVertexNum;i++)Visited[i]=false;//初始化为falseMGraph Graph=BuildGraph();BFS(Graph,0,Visit);return 0;}

图的遍历之BSF广度优先算法6.2.2(网络整理)相关推荐

  1. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  2. 图的遍历(搜索)算法 之 深度优先遍历算法

    图的遍历的定义: 从图中的某个顶点出发访问遍图中的所有顶点,并且每个顶点仅仅被访问一次. 图的遍历算法我们常见的而且用的最多的就有两种:其一是图的深度优先遍历算法:其二是图的广度优先遍历算法.这里我们 ...

  3. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

  4. 图的遍历 深度与广度优先遍历

    图的遍历 本文作者 Mr.赵 Email: lovelyalan@foxmail.com 原创文章,转载标明作者,部分图片素材来自网络 从图中某一顶点出发遍历图中其余顶点,且使每一个顶点仅被访问一次, ...

  5. 算法:C++实现图的遍历

    ​​​​​​ 目录 图的遍历 深度优先搜索法 广度优先搜索法 代码及注释部分 图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操 ...

  6. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  7. 图的遍历(BFS、DFS)

    前文使用邻接矩阵法和邻接链表法实现了图结构(MatrixGraph .ListGraph ),本节使用两种算法进行图的遍历 目录 1.定义与概括 2.广度优先搜索算法 3.深度优先搜索算法 4.小结 ...

  8. 广度优先算法(BFS)

    根据访问节点的顺序与方式,可以分为广度优先算法(BFS)和深度优先算法(DFS),本文我打算先介绍广度优先算法: 广度优先算法 1. 算法概述 广度优先搜索算法(又称宽度优先搜索.BFS)是最简便的图 ...

  9. java实现广度优先算法

    实现思路 广度优先方式,是一种地毯式搜索,层层递进的方式,即从开始节点依次遍历相邻节点,层层递进 代码实现 基于之前图的数据结构,实现广度优先算法 import java.util.*;/*** 邻接 ...

最新文章

  1. 爬虫之 xpath的节点关系
  2. HTML5 Canvas动画效果实现原理
  3. Transport Ship【多重背包】
  4. Python高级——魔法属性和方法
  5. Cmake-add_library()
  6. 雅思准考证可以下载到电脑上吗
  7. 数据结构课程设计实验报告
  8. 程序员转正述职报告_程序员个人述职报告范文4篇(整理版)
  9. 汽车座椅测试能力全解析
  10. MySQL数据库操作练习题-各种操作掌握MySQL查询操作
  11. 亚马逊中东站好做吗?这或许是迄今为止最好的回答!
  12. Qt中QOpengl的QMatrix4x4矩阵作用原理以及使用方法
  13. 从erp入门说到产业互联网络
  14. Java是剑客,.NET是刀客
  15. maven 系列 02 - packing 类型
  16. 如何利用研发管理工具 更好实践IPD流程
  17. 华软mysql考试_在广州大学华软软件学院就读是怎样一番体验?
  18. 如何使用ag-Grid
  19. 高德地图——查询天气
  20. 性能监控综述:Rails核心团队与New Relic合作,FiveRuns TuneUp支持Merb

热门文章

  1. 童继龙的ERP顾问成长感悟
  2. 新一代超高精度双回路张力控制器
  3. 正则表达式中(括号) [方括号] {大括号}的区别
  4. VSCODE下载速度慢的问题
  5. 【moodle】moodle dialog开发笔记 1
  6. 我的Photoshop大师之路(五)
  7. 同步fork的上游仓库代码更新:git pull upstream
  8. MATLAB中输入微分方程dy表示,怎么用MATLAB求解如Dy = y+1/y 的微分方程
  9. 为ubuntu装好搜狗拼音法
  10. php查询google pr值接口api介绍,php获取网站谷歌pr值方法