图的遍历--BFS
图的遍历–BFS
树的广度优先遍历
树VS图
代码实现
广度优先遍历序列
遍历序列的可变性
算法存在的问题
改进算法
复杂度分析
广度优先生成树
广度优先生成森林
总结
完整代码实现
- 基于邻接矩阵实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
typedef char VertexType;
typedef int EdgeType;
// 邻接矩阵
typedef struct {
VertexType vexs[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵
int numVertexer,numEdges;
}GraphMatrix;
// 邻接表
// 边结点
typedef struct EdgeNode{
int adjVex;
EdgeType weight;
struct EdgeNode* next;
}EdgeNode;
typedef struct VertrNode{
VertexType data;
struct EdgeNode* firstEdge;
}VertrNode,AdjList[MAXVEX];
typedef struct GraphAdj{
int numVertex,numEdge;
AdjList adjList;
}GraphAdjList;
typedef struct {
int font;
int rear;
EdgeType *data;
int size;
}Queue;
Queue InitQueue(Queue *q){
(*q).data = (int *) malloc(sizeof (int));
if((*q).data == NULL){
printf("内存分配失败\n");
return (*q);
}
(*q).rear = (*q).font = 0;
return *q;
};
Queue PushQueue(Queue* q,int k){
q->data[q->rear] = k;
q->rear ++;
return *q;
}
int PopQueue(Queue* q){
int k = q->data[q->font];
q->font++;
return k;
}
int IsEmpey(Queue q){
if(q.font == q.rear)
return 1;
else
return 0;
}
void CreateGraphAdjList(GraphAdjList* G){
int i,j,k,w;
printf("请输入顶点数与边的数量:\n");
scanf("%d%d",&G->numVertex,&G->numEdge);
getchar();
printf("请输入每个顶点的数据域:\n");
for(i = 0;i < G->numVertex;i ++){
scanf("%c",&G->adjList[i].data);
G->adjList[i].firstEdge = NULL;
}
for(k = 0;k < G->numEdge;k ++){
printf("请输入(Vi,Vj)上顶点的下标i、j即权重W:\n");
scanf("%d%d%d",&i,&j,&w);
EdgeNode *q = (EdgeNode*) malloc(sizeof (EdgeNode));
q->adjVex = j;
q->weight = w;
q->next = G->adjList[i].firstEdge;
G->adjList[i].firstEdge = q;
}
}
void CreateGraphMatrix(GraphMatrix *G){
int i,j,k,w;
printf("请输入顶点数和边数\n");
scanf("%d%d",&G->numVertexer,&G->numEdges);
getchar();
printf("请输入每个顶点的数据域:\n");
for(i = 0;i < G->numVertexer;i ++)
scanf("%c",&G->vexs[i]);
for(i = 0;i < G->numVertexer;i ++)
for(j = 0;j < G->numVertexer;j ++){
G->arc[i][j] = 0;
}
for(k = 0;k < G->numEdges;k ++){
printf("请输入point1/point2及它们之间的权重w:\n");
scanf("%d%d%d",&i,&j,&w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
void BFS(GraphMatrix *G,int v,int visited[]){
Queue Q;
Q = InitQueue(&Q);
PushQueue(&Q,v);
visited[v] = 1;
while(!IsEmpey(Q)){
int n = PopQueue(&Q);
printf("%c ",G->vexs[n]);
for(int k = 0;k < G->numVertexer;k ++){
if(G->arc[n][k] && !visited[k]){
PushQueue(&Q,k);
visited[k] = 1;
}
}
}
}
void BFS_Graph(GraphMatrix G){
int visited[G.numVertexer];
for(int i = 0;i < G.numVertexer;i ++)
visited[i] = 0;
for(int i = 0;i < G.numVertexer;i++){
if(!visited[i])
BFS(&G,i,visited);
}
}
void BFS_AL(GraphAdjList *G,int v,int visited[]){
Queue Q;
Q = InitQueue(&Q);
EdgeNode *p;
PushQueue(&Q,v);
visited[v] = 1;
int pop;
while(!IsEmpey(Q)){
pop = PopQueue(&Q);
printf("%c",G->adjList[pop].data);
p = G->adjList[pop].firstEdge;
while(p){
if(!visited[p->adjVex]){
PushQueue(&Q,p->adjVex);
visited[p->adjVex] = 1;
}
p = p->next;
}
}
}
void BFS_ALGraph(GraphAdjList G){
int visited[G.numVertex];
for(int i = 0;i < G.numVertex;i ++)
visited[i] = 0;
for(int i = 0;i < G.numVertex;i ++){
if(!visited[i]){
BFS_AL(&G,i,visited);
}
}
}
int main(){
// GraphMatrix G;
// printf("------邻接矩阵的【创建】------\n");
// CreateGraphMatrix(&G);
// printf("------邻接矩阵的【BFS遍历】------\n");
// BFS_Graph(G);
printf("------邻接矩阵的【创建】------\n");
GraphAdjList GA;
CreateGraphAdjList(&GA);
printf("------邻接矩阵的【BFS遍历】------\n");
BFS_ALGraph(GA);
return 0;
} - 基于邻接表实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
typedef char VertexType;
typedef int EdgeType;
typedef struct {
VertexType vexs[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵
int numVertexer,numEdges;
}GraphMatrix;
typedef struct {
int front;
int rear;
int *data;
int size;
}Queue;
Queue InitQueue(Queue *q, int initSize) {
(*q).data = (int*)malloc(sizeof(int) * initSize);
if ((*q).data == NULL) {
printf("内存分配失败\n");
exit(0);
}
(*q).front = (*q).rear = 0;
(*q).size = initSize;
return *q;
}
void PushQueue(Queue* q, int k) {
if ((q->rear + 1) % q->size == q->front) {
q->data = (int*)realloc(q->data, sizeof(int) * q->size * 2);
q->size *= 2;
}
q->data[q->rear] = k;
q->rear = (q->rear + 1) % q->size;
}
int PopQueue(Queue* q) {
int value = q->data[q->front];
q->front = (q->front + 1) % q->size;
return value;
}
int IsEmpty(Queue q) {
if (q.front == q.rear)
return 1;
else
return 0;
}
void CreateGraphMatrix(GraphMatrix *G){
int i,j,k,w;
printf("请输入顶点数和边数\n");
scanf("%d%d",&G->numVertexer,&G->numEdges);
getchar();
printf("请输入每个顶点的数据域:\n");
for(i = 0;i < G->numVertexer;i ++)
scanf("%c",&G->vexs[i]);
for(i = 0;i < G->numVertexer;i ++)
for(j = 0;j < G->numVertexer;j ++)
G->arc[i][j] = 0;
for(k = 0;k < G->numEdges;k ++){
printf("请输入point1/point2及它们之间的权重w:\n");
scanf("%d%d%d",&i,&j,&w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
void BFS(GraphMatrix *G,int v,int visited[],Queue* q){
PushQueue(q,v);
visited[v] = 1;
while(!IsEmpty(*q)){
int n = PopQueue(q);
printf("%c ",G->vexs[n]);
for(int k = 0;k < G->numVertexer;k ++){
if (G->arc[n][k] && !visited[k]) {
PushQueue(q,k);
visited[k] = 1;
}
}
}
}
void BFS_Graph(GraphMatrix G){
int visited[G.numVertexer];
Queue q;
InitQueue(&q, G.numVertexer);
for(int i = 0;i < G.numVertexer;i++){
visited[i] = 0;
}
for(int i = 0;i < G.numVertexer;i++){
if(!visited[i]) {
BFS(&G, i, visited, &q);
}
}
}
int main(){
GraphMatrix G;
printf("------邻接矩阵的【创建】------\n");
CreateGraphMatrix(&G);
printf("------邻接矩阵的【BFS遍历】------\n");
BFS_Graph(G);
return 0;
}
图的遍历--BFS
https://lzyjx.github.io.git/2023/05/23/图的遍历-BFS/