图的广度优先搜索(BFS)

把以前写过的图的广度优先搜索分享给大家(C语言版)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define MAX_VERTEX_NUM 20
  4 #define MAXQSIZE 100
  5 #define OK 1
  6 typedef char VertexType;
  7 typedef int QElemType;
  8
  9 typedef struct ArcNode//边结点
 10 {
 11     int adjvex;
 12     struct ArcNode *nextarc;
 13 }ArcNode;
 14
 15 typedef struct VNode//定义头数组
 16 {
 17     VertexType data;
 18     ArcNode *firstarc;
 19 }VNode,AdjList[MAX_VERTEX_NUM];
 20
 21 typedef struct ALGraph//定义图
 22 {
 23     AdjList vertices;
 24     int vernum,arcnum;
 25 }ALGraph;
 26
 27 typedef struct SqQueue
 28 {
 29     QElemType *base;
 30     int front;
 31     int rear;
 32 }SqQueue;
 33
 34 int CreateDG(ALGraph &G)
 35 {
 36     int i,j,k,v1,v2;
 37     ArcNode *p;
 38     printf("请输入图的节点数:");
 39     scanf("%d",&G.vernum );
 40     printf("请输入图的边的个数:");
 41     scanf("%d",&G.arcnum);
 42     for(i=0;i<G.vernum;i++)
 43     {
 44         printf("请输入第%d个顶点数据:",i+1);
 45         getchar();
 46         scanf("%c",&G.vertices[i].data);
 47         //G.vertices[i].data=i;
 48         G.vertices[i].firstarc=NULL;
 49     }
 50     printf("请输入节点的边关系,如:结点1和结点2有边就输入1和2(每条边就输入一次):\n");
 51     for(k=0;k<G.arcnum;k++)
 52     {
 53         printf("请输入第%d条边的一个结点:",k+1);
 54         scanf("%d",&v1);
 55         printf("请输入第%d条边的另一个结点:",k+1);
 56         scanf("%d",&v2);
 57         printf("\n");
 58         i=v1;
 59         j=v2;
 60         while(i<1||i>G.vernum||j<1||j>G.vernum)
 61         {
 62             printf("请输入第%d条边的一个结点:",k+1);
 63             scanf("%d",&v1);
 64             printf("请输入第%d条边的一个结点:",k+1);
 65             scanf("%d",&v2);
 66             printf("\n");
 67             i=v1;
 68             j=v2;
 69         }
 70         p=(ArcNode *)malloc(sizeof(ArcNode));
 71         if(!p)
 72         {
 73             printf("分配内存失败!\n");
 74             return 0;
 75         }
 76         p->adjvex=j-1;
 77         p->nextarc=G.vertices[i-1].firstarc;
 78         G.vertices[i-1].firstarc=p;
 79     }
 80     return OK;
 81 }
 82 int InitQueue(SqQueue &Q)
 83 {
 84     Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
 85     if(!Q.base)
 86     {
 87         printf("队列内存失败!\n");
 88         return 0;
 89     }
 90     Q.front=Q.rear=0;
 91     return (OK);
 92 }
 93
 94 int EnQueue(SqQueue &Q,QElemType e)
 95 {
 96     if((Q.rear+1)%MAXQSIZE==Q.front)
 97     {
 98         printf("队列已满!\n");
 99         return 0;
100     }
101     Q.base[Q.rear]=e;
102     Q.rear=(Q.rear+1)%MAXQSIZE;
103     return (OK);
104 }
105 int QueueEmpty(SqQueue Q)
106 {
107     if(Q.front==Q.rear)
108         return (OK);
109     else
110         return 0;
111 }
112
113 int DeQueue(SqQueue &Q,QElemType &e)
114 {
115     if(Q.front==Q.rear)
116     {
117         printf("队列为空!无法删除!\n");
118         return 0;
119     }
120     e=Q.base[Q.front];
121     Q.front=(Q.front+1)%MAXQSIZE;
122     return (e);
123 }
124 void BFSTraverse(ALGraph G)
125 {
126     int i,j,k;
127     int visited[MAX_VERTEX_NUM];
128     ArcNode *p;
129     SqQueue Q;
130     for(i=0;i<G.vernum;i++)
131         visited[i]=0;
132     InitQueue(Q);
133     for(i=0;i<G.vernum;i++)
134     {
135         if(visited[i]==0)
136         {
137             visited[i]=1;
138             printf("%c-->",G.vertices[i].data);
139             EnQueue(Q,i);
140             while(!QueueEmpty(Q))
141             {
142                 DeQueue(Q,j);
143                 for(k=j,p=G.vertices[j].firstarc;p!=NULL;k=p->adjvex,p=p->nextarc)
144                 {
145                     if(visited[k]==0)
146                     {
147                         visited[k]=1;
148                         printf("%c-->",G.vertices[k].data);
149                         EnQueue(Q,k);
150                     }
151                 }
152             }
153         }
154     }
155 }
156 int main()
157 {
158     ALGraph G;
159     CreateDG(G);
160
161     printf("广度优先搜索结果为\n开始-->");
162     BFSTraverse(G);
163     printf("结束!\n");
164     return 0;
165 }

运行结果截图:

时间: 2024-08-02 05:02:46

图的广度优先搜索(BFS)的相关文章

ACM题目————图的广度优先搜索

题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结点以“A”--“Z”中的若干字符表示,且要求结点的访问顺序要求根据由 “A”至“Z”的字典顺序进行访问. 输入 输入只包含一个测试用例,第一行为一个自然数n,表示顶点的个数,第二行为n个大写字母构成的字符串,表示顶点,接下来是为一个n*n大小的矩阵,表示图的邻接关系.数字为0表示不邻接,否则为相应的

图的广度优先搜索

图的广度优先搜索基本思想和树的层次遍历差不错.与树的层次遍历不同的是,图中可能包含回路,我们遍历完一个节点,继续进行遍历,可能会回到已经遍历过的节点.为了避免遍历一个节点两次,需要开辟一个bool型的数组来标记该节点是否已经遍历过. #include <iostream> #include <list> #include <queue> using namespace std; //This class represents a directed graph using

【数据结构】图的广度优先搜索

图的广度优先搜索(BFS)与树的广度优先搜索类似.与树不同的是,图中可能存在循环.所我们可能会再次访问到同一个节点.为了表面多次处理同一个节点,我们要布尔变量数据记录节点有没有被访问过.为了简化,我们假设所有的节点都是从根节点可达的. 比如在下图中,我们从节点2出发.当我们访问到节点0时,我们寻找所有与他相邻的节点.节点2就是与0相邻的节点,如果我们不对已访问的节点做标记,那么节点2就会被重复访问.这样的话,算法将会一直进行下去.对下图进行广度优先搜索的结果是2,0,3,1. 以下C++程序是从

广度优先搜索(BFS)

广度优先 Description: 阿狸被困在迷宫,snoopy要去救他,snoopy可以向上.下.左.右四个方向行走,每走一步(格)就要喝掉一瓶益力多.现在给它一个迷宫地图请问:snoopy最少需要多少瓶益力多才能走出迷宫? Input: 先输入一个数t,表示测试的数据个数, 下面输入的就是t个迷宫, 每个迷宫的输入都应包含以下数据, 输入迷宫的大小 n(n<=15),表示迷宫大小为n*n. 再输入迷宫, 用大写字母“S”表示snoopy的位置, 用小写字母“E”表示阿狸被困的位置, 用“.”

【算法导论】--C++实现广度优先搜索bfs

一.题目 根据上次随机生成的100个顶点的无向图和有向图,对其进行广度优先搜索. 二.理解广度优先搜索 广度优先搜索可以将其想象成水滴落入水面溅起了的一圈一圈的涟漪,是由一个起始点开始一圈一圈进行扩散搜索的. [课上老师是这样说的,大家想象一下,发现其实非常形象] 广度优先搜索总是从一个起始点出发,首先扩散这个点周围所有的邻居,然后邻居在去扩散邻居的邻居(*^-^*)...然后一直到最后将整张图都扩散完. 三.代码实现 对于第一次随机生成100个顶点的图进行了细节的修改,将每个顶点的类型改为了自

深度优先搜索DFS和广度优先搜索BFS

DFS简介 深度优先搜索,从起点开始按照某个原则一直往深处走,直到找到解,或者走不下去,走不下去则回溯到前一节点选择另一条路径走,直到找到解为止. BFS简介 广度优先搜索,从起点开始先搜索其相邻的节点,由此向外不断扩散,直到找到解为止. 举例解释 从1开始去寻找5 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1 2.5     5.3 5出来则找到 遍历图中所有点 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1

算法与数据结构基础 - 广度优先搜索(BFS)

BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi

广度优先搜索BFS

广度优先搜索可以形成一个广度优先搜索树 算法时间为O(V+E),两重循环 输入:图g,起点start(int) 需要的数据结构:队列Q.color数组(存放每个顶点的颜色) 算法过程: 1. 预处理:1)color数组的每个值都赋为white(表示没被访问过):2)队列Q为空队列 2. 处理起点: 1)color[start]=gray,gray表示顶点已被访问,但其子节点未被处理(指的是入队列):2)Q.enQueue(start) 3. 循环以下操作,直到Q为空 1)int u=Q.deQu

算法学习 - 图的广度优先遍历(BFS) (C++)

广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不懂的人.请先学下图的存储方法.在我的之前博客里. 传送门:图表示方法 然后我们如果有一个图例如以下: 节点1->3->NULL 节点2->NULL 节点3->2->4->NULL 节点4->1->2->NULL 这样我们已经知道这是一个什么图了. 如果我们