有点问题广度优先搜索出来的是错的
时间: 2024-02-06 22:12:07 浏览: 18
非常抱歉,我刚才的回答里漏掉了一点,广度遍历的实现还需要对队列进行初始化。在代码中,我们需要将队首指针和队尾指针都初始化为0,以便在广度遍历过程中能够正确地出队和入队。请使用下面这份修改过的代码进行尝试:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXV 100 // 最大顶点数
#define INF 0x3f3f3f // 无穷大
char vertex[MAXV][20]; // 顶点名称
int matrix[MAXV][MAXV]; // 邻接矩阵
int visited[MAXV]; // 标记数组,用于深度遍历
int queue[MAXV]; // 队列,用于广度遍历
int front = 0; // 队首指针
int rear = 0; // 队尾指针
struct Edge {
int start; // 起点在vertex数组中的下标
int end; // 终点在vertex数组中的下标
int weight; // 权值
};
void createGraph(int m, int n) {
// 输入顶点名称
for (int i = 0; i < m; i++) {
scanf("%s", vertex[i]);
}
// 初始化邻接矩阵
memset(matrix, INF, sizeof(matrix));
// 输入边的信息
for (int i = 0; i < n; i++) {
char start[20], end[20];
int weight;
scanf("%s %s %d", start, end, &weight);
int u = -1, v = -1;
for (int j = 0; j < m; j++) {
if (strcmp(start, vertex[j]) == 0) {
u = j;
}
if (strcmp(end, vertex[j]) == 0) {
v = j;
}
if (u != -1 && v != -1) {
break;
}
}
matrix[u][v] = matrix[v][u] = weight;
}
}
void dfs(int u) {
visited[u] = 1;
printf("%s ", vertex[u]);
for (int v = 0; v < MAXV; v++) {
if (matrix[u][v] != INF && visited[v] == 0) {
dfs(v);
}
}
}
void bfs(int u, int m) {
visited[u] = 1;
queue[rear++] = u;
while (front != rear) {
int v = queue[front++];
printf("%s ", vertex[v]);
for (int w = 0; w < m; w++) {
if (matrix[v][w] != INF && visited[w] == 0) {
visited[w] = 1;
queue[rear++] = w;
}
}
}
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
createGraph(m, n);
memset(visited, 0, sizeof(visited));
char start[20];
scanf("%s", start);
int u = -1;
for (int i = 0; i < m; i++) {
if (strcmp(start, vertex[i]) == 0) {
u = i;
break;
}
}
printf("深度遍历序列:");
dfs(u);
printf("\n");
memset(visited, 0, sizeof(visited));
front = rear = 0;
printf("广度遍历序列:");
bfs(u, m);
printf("\n");
return 0;
}
```
在这份修改过的代码中,我们在广度遍历函数bfs中,先将起点u的visited标记为1,并将其加入到队列中。然后,只要队列不为空,就从队列中取出一个顶点v,并输出它的名称。接着,我们遍历与v相邻的所有顶点w,如果w未被访问过,则将其visited标记为1,并将其加入到队列中。这样,我们就能够正确地实现广度遍历了。