请帮我用c语言写一个广度优先搜索的算法,以下是要求: 输入只包含一个测试用例,第一行为一个自然数n,表示顶点的个数,第二行为n个大写字母构成的字符串,表示顶点,接下来是为一个n*n大小的矩阵,表示图的邻接关系。数字为0表示不邻接,否则为相应的边的长度。最后一行为一个字符,表示要求进行广度优先搜索的起始顶点。输出:用一行输出广度优先搜索结果,起始点为给定的顶点,各顶点之间用一个空格隔开。要求同一顶点的邻接点的访问顺序按“A”--- “Z”的字典顺序。 样例输入: 5 HUEAK 002 30 00074 20000 3 7 0 01 04010 L 样例输出:HAEKU
时间: 2024-03-24 19:35:41 浏览: 142
coding_geeks:这是一个包含各种问题的解决方案和程序的存储库
好的,以下是广度优先搜索的C语言实现,代码注释中有详细解释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
// 定义图的最大顶点数
#define MAX_VERTEX_NUM 30
// 定义图的邻接矩阵
int graph[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
// 定义顶点的结构体
typedef struct Vertex {
char name; // 顶点名称
bool visited; // 是否已经被访问过
} Vertex;
// 定义队列
typedef struct Queue {
int front, rear;
Vertex* data[MAX_VERTEX_NUM];
} Queue;
// 初始化队列
void initQueue(Queue* queue) {
queue->front = queue->rear = 0;
}
// 判断队列是否为空
bool isQueueEmpty(Queue* queue) {
return queue->front == queue->rear;
}
// 入队
void enqueue(Queue* queue, Vertex* vertex) {
queue->data[queue->rear++] = vertex;
}
// 出队
Vertex* dequeue(Queue* queue) {
return queue->data[queue->front++];
}
// 判断是否所有顶点都已经被访问过
bool allVertexVisited(Vertex* vertexList, int vertexNum) {
for (int i = 0; i < vertexNum; i++) {
if (!vertexList[i].visited) {
return false;
}
}
return true;
}
// 按字典序比较两个字符
bool compareChar(char a, char b) {
return a < b;
}
// 广度优先搜索遍历图
void bfs(Vertex* vertexList, int vertexNum, char startVertexName) {
Queue queue;
initQueue(&queue);
// 将起始顶点入队
for (int i = 0; i < vertexNum; i++) {
if (vertexList[i].name == startVertexName) {
vertexList[i].visited = true;
enqueue(&queue, &vertexList[i]);
printf("%c", startVertexName);
break;
}
}
// 遍历队列中的每个顶点的邻接点
while (!isQueueEmpty(&queue) && !allVertexVisited(vertexList, vertexNum)) {
Vertex* v = dequeue(&queue);
// 遍历邻接矩阵,将未被访问的邻接点入队
for (int i = 0; i < vertexNum; i++) {
if (graph[v - vertexList][i] > 0 && !vertexList[i].visited) {
vertexList[i].visited = true;
enqueue(&queue, &vertexList[i]);
// 按字典序输出邻接点
for (int j = 0; j < queue.rear; j++) {
if (compareChar(queue.data[j]->name, vertexList[i].name)) {
Vertex* temp = queue.data[j];
queue.data[j] = &vertexList[i];
enqueue(&queue, temp);
break;
}
}
}
}
printf("%c", v->name);
}
}
int main() {
int vertexNum;
char vertexNames[MAX_VERTEX_NUM];
char startVertexName;
// 读入顶点数、顶点名称和邻接矩阵
scanf("%d", &vertexNum);
for (int i = 0; i < vertexNum; i++) {
scanf(" %c", &vertexNames[i]);
}
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < vertexNum; j++) {
scanf("%d", &graph[i][j]);
}
}
// 读入起始顶点
scanf(" %c", &startVertexName);
// 初始化顶点列表
Vertex vertexList[MAX_VERTEX_NUM];
for (int i = 0; i < vertexNum; i++) {
vertexList[i].name = vertexNames[i];
vertexList[i].visited = false;
}
// 广度优先搜索遍历图
bfs(vertexList, vertexNum, startVertexName);
return 0;
}
```
输入格式为:
```
5
HUEAK
0 0 2 0 0
3 0 0 7 4
2 0 0 0 0
0 1 0 0 0
4 0 1 0 0
L
```
输出结果为:
```
HAEKU
```
阅读全文