图论(二)--广度优先搜索(BFS)
来源:互联网 发布:域名的a记录 编辑:程序博客网 时间:2024/05/28 16:22
基于算法导论图算法-广度优先搜索
- 题目描述
- 问题分析
- 源代码
- 结果截图
题目描述
使用广度优先搜索遍历图:
输入:图G和源顶点s
输出:从s到所有顶点的最短距离
问题分析
广搜的思想类似水滴的扩散,在此不再赘述。
本例中一开始所有节点为白色,进队列后变为灰色,出队列后变为黑色。
伪代码
源代码
以下代码基于图论(一)–图的建立中代码创建的图G进行编写
void BFS(Graph G, Vertex s);//广度优先搜索void print_path_twoPoint(Graph G, Vertex s, Vertex v);//打印两点路径void print_dist(Graph G, Vertex s);//打印各顶点到顶点s的距离和路径
图的点结构需要变化
struct VertexRecord { Vertex pred;//先驱结点 int in_degree;//入度 int out_degree;//出度 int color;//顶点状态 int dist;//距离源点的距离 List adjto;//指向第一个邻接结点的指针};
#include<queue>void print_path_twoPoint(Graph G,Vertex s, Vertex v) { if (v == s) { printf(" %d",s); }else if(G->vertices[v].pred == -1){ printf("无相应路径"); } else { print_path_twoPoint(G, s, G->vertices[v].pred); printf(" %d", v); }}void print_dist(Graph G , Vertex s) {//打印各顶点到顶点s的距离和路径 for (int i = 0; i < G->vexnum; i++) { printf("顶点%d与%d的距离:%d,路径为:", s, i, G->vertices[i].dist); print_path_twoPoint(G, s, i); printf("\n"); }}void BFS(Graph G, Vertex s) { Vertex u, v; PtrToNode ptr; for (int i = 0; i < G->vexnum; i++) { G->vertices[i].color = 0;//白色,表示未搜索 G->vertices[i].dist = INF; G->vertices[i].pred = -1; } G->vertices[s].color = 1;//灰色,在队列里 G->vertices[s].dist = 0; G->vertices[s].pred = -1; queue<Vertex> Q; Q.push(s); //int count = 0; while (!Q.empty()) { u = Q.front(); Q.pop(); ptr = G->vertices[u].adjto; while (ptr != NULL) { v = ptr->adjvex; if (G->vertices[v].color == 0) { G->vertices[v].color = 1; G->vertices[v].dist = G->vertices[u].dist + 1;//权为1计算 G->vertices[v].pred = u; Q.push(v); } ptr = ptr->next; } G->vertices[u].color = 2;//黑色 printf("%d ", u); } printf("\n"); print_dist(G, s);}int main() { //有向图的随机生成(20个顶点,100左右的边,可以进行修改) //CreateRandomDirectGraph(); //Graph G = CreateDirectGraph(); //无向边的随机生成(20个顶点,50左右的边) CreateRandomUndirectGraph(); Graph G = CreateUndirectGraph(); printf("打印图结构:\n"); print_graph(G);//打印图 //printf("\n打印各顶点入度和出度:\n"); //print_VertexDegree(G);//打印顶点度数 //printf("\n打印每条边的权值:\n"); //print_EdgeWeight(G);//打印边权 printf("\n下面是bfs:\n"); BFS(G, 0); return 0; }
结果截图
0 0
- 图论(二)--广度优先搜索(BFS)
- 广度优先搜索(BFS)
- 广度优先搜索(BFS)
- 广度优先搜索(BFS)
- 广度优先搜索(BFS)
- BFS(广度优先搜索)
- 步步为营(十六)搜索(二)BFS 广度优先搜索
- 搜索(广度优先搜索) BFS 1
- 搜索(广度优先搜索)BFS 2
- 广度优先遍历(搜索)(BFS)
- 广度优先搜索(BFS)算法
- BFS-广度优先搜索算法(图)
- 广度优先搜索算法(BFS)
- ()HDU 1548 BFS 广度优先搜索
- 【算法】广度优先搜索(BFS)I
- 【算法】广度优先搜索(BFS)II
- 图的广度优先搜索(BFS)
- 广度优先搜索模板(BFS)
- 工作中用到的一些Git命令
- run-parts 命令的用法及原理
- java中main函数
- 服务器错题集
- nginx变量学习初步-读章亦春的博客做个笔记
- 图论(二)--广度优先搜索(BFS)
- MySQL视图和事务
- 将数组的元素逆序打印(用指针实现)
- 如何修改项目加载包默认的node_modules路径
- google基本语法
- angular第二讲
- LoaderManager加载器初识
- 猴子吃桃子问题
- 团体程序设计天梯赛L2-023 图着色问题