图的遍历之BSF广度优先算法6.2.2(网络整理)
图的广度优先遍历和树的层序遍历相似,伪代码见下图:
(以上图片来自网络)
#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(网络整理)相关推荐
- 图的遍历——深度优先搜索+广度优先搜索
一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...
- 图的遍历(搜索)算法 之 深度优先遍历算法
图的遍历的定义: 从图中的某个顶点出发访问遍图中的所有顶点,并且每个顶点仅仅被访问一次. 图的遍历算法我们常见的而且用的最多的就有两种:其一是图的深度优先遍历算法:其二是图的广度优先遍历算法.这里我们 ...
- 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...
- 图的遍历 深度与广度优先遍历
图的遍历 本文作者 Mr.赵 Email: lovelyalan@foxmail.com 原创文章,转载标明作者,部分图片素材来自网络 从图中某一顶点出发遍历图中其余顶点,且使每一个顶点仅被访问一次, ...
- 算法:C++实现图的遍历
目录 图的遍历 深度优先搜索法 广度优先搜索法 代码及注释部分 图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操 ...
- 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)
内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...
- 图的遍历(BFS、DFS)
前文使用邻接矩阵法和邻接链表法实现了图结构(MatrixGraph .ListGraph ),本节使用两种算法进行图的遍历 目录 1.定义与概括 2.广度优先搜索算法 3.深度优先搜索算法 4.小结 ...
- 广度优先算法(BFS)
根据访问节点的顺序与方式,可以分为广度优先算法(BFS)和深度优先算法(DFS),本文我打算先介绍广度优先算法: 广度优先算法 1. 算法概述 广度优先搜索算法(又称宽度优先搜索.BFS)是最简便的图 ...
- java实现广度优先算法
实现思路 广度优先方式,是一种地毯式搜索,层层递进的方式,即从开始节点依次遍历相邻节点,层层递进 代码实现 基于之前图的数据结构,实现广度优先算法 import java.util.*;/*** 邻接 ...
最新文章
- 爬虫之 xpath的节点关系
- HTML5 Canvas动画效果实现原理
- Transport Ship【多重背包】
- Python高级——魔法属性和方法
- Cmake-add_library()
- 雅思准考证可以下载到电脑上吗
- 数据结构课程设计实验报告
- 程序员转正述职报告_程序员个人述职报告范文4篇(整理版)
- 汽车座椅测试能力全解析
- MySQL数据库操作练习题-各种操作掌握MySQL查询操作
- 亚马逊中东站好做吗?这或许是迄今为止最好的回答!
- Qt中QOpengl的QMatrix4x4矩阵作用原理以及使用方法
- 从erp入门说到产业互联网络
- Java是剑客,.NET是刀客
- maven 系列 02 - packing 类型
- 如何利用研发管理工具 更好实践IPD流程
- 华软mysql考试_在广州大学华软软件学院就读是怎样一番体验?
- 如何使用ag-Grid
- 高德地图——查询天气
- 性能监控综述:Rails核心团队与New Relic合作,FiveRuns TuneUp支持Merb
热门文章
- 童继龙的ERP顾问成长感悟
- 新一代超高精度双回路张力控制器
- 正则表达式中(括号) [方括号] {大括号}的区别
- VSCODE下载速度慢的问题
- 【moodle】moodle dialog开发笔记 1
- 我的Photoshop大师之路(五)
- 同步fork的上游仓库代码更新:git pull upstream
- MATLAB中输入微分方程dy表示,怎么用MATLAB求解如Dy = y+1/y 的微分方程
- 为ubuntu装好搜狗拼音法
- php查询google pr值接口api介绍,php获取网站谷歌pr值方法