生成一个用广度优先算法求解连通图的c语言代码
时间: 2024-05-02 17:22:04 浏览: 88
以下是用广度优先搜索算法实现连通图的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
#define MAX_QUEUE_SIZE 100 // 最大队列长度
/* 队列结构体 */
typedef struct {
int data[MAX_QUEUE_SIZE]; // 存放队列元素的数组
int front; // 队首指针
int rear; // 队尾指针
} Queue;
/* 图的结构体 */
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存放顶点的数组
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存放边的二维数组
int vertex_num; // 顶点数
int edge_num; // 边数
} Graph;
/* 初始化队列 */
void initQueue(Queue *queue) {
queue->front = queue->rear = 0;
}
/* 判断队列是否为空 */
int isQueueEmpty(Queue *queue) {
return queue->front == queue->rear;
}
/* 判断队列是否已满 */
int isQueueFull(Queue *queue) {
return (queue->rear + 1) % MAX_QUEUE_SIZE == queue->front;
}
/* 入队操作 */
void enqueue(Queue *queue, int vertex) {
if (!isQueueFull(queue)) {
queue->data[queue->rear] = vertex;
queue->rear = (queue->rear + 1) % MAX_QUEUE_SIZE;
}
}
/* 出队操作 */
int dequeue(Queue *queue) {
int vertex = -1;
if (!isQueueEmpty(queue)) {
vertex = queue->data[queue->front];
queue->front = (queue->front + 1) % MAX_QUEUE_SIZE;
}
return vertex;
}
/* 初始化图 */
void initGraph(Graph *graph) {
int i, j;
printf("请输入顶点数和边数:\n");
scanf("%d %d", &graph->vertex_num, &graph->edge_num);
printf("请输入顶点:\n");
for (i = 0; i < graph->vertex_num; i++) {
scanf("%d", &graph->vertex[i]);
}
for (i = 0; i < graph->vertex_num; i++) {
for (j = 0; j < graph->vertex_num; j++) {
graph->edge[i][j] = 0;
}
}
printf("请输入边的两个顶点:\n");
for (i = 0; i < graph->edge_num; i++) {
int a, b;
scanf("%d %d", &a, &b);
graph->edge[a][b] = graph->edge[b][a] = 1;
}
}
/* 广度优先搜索 */
void bfs(Graph *graph, int start) {
int i, vertex;
int visited[MAX_VERTEX_NUM] = { 0 }; // 标记顶点是否被访问过
Queue queue;
initQueue(&queue); // 初始化队列
visited[start] = 1; // 标记起始顶点为已访问
enqueue(&queue, start); // 将起始顶点入队
printf("广度优先搜索结果:\n");
while (!isQueueEmpty(&queue)) {
vertex = dequeue(&queue); // 出队一个顶点
printf("%d ", graph->vertex[vertex]); // 访问该顶点
for (i = 0; i < graph->vertex_num; i++) { // 遍历该顶点的邻接顶点
if (graph->edge[vertex][i] == 1 && visited[i] == 0) { // 如果邻接顶点未被访问过
visited[i] = 1; // 标记邻接顶点为已访问
enqueue(&queue, i); // 将邻接顶点入队
}
}
}
}
int main() {
Graph graph;
initGraph(&graph); // 初始化图
bfs(&graph, 0); // 从第一个顶点开始进行广度优先搜索
return 0;
}
```
阅读全文