邻接矩阵的BFS c语言代码
时间: 2024-11-21 11:38:52 浏览: 47
邻接矩阵通常用于表示图的数据结构,其中每个元素表示两个顶点之间是否存在边。以下是C语言中使用邻接矩阵实现广度优先搜索(Breadth First Search, BFS)的基本步骤:
```c
#include <stdio.h>
// 定义邻接矩阵的结构体
typedef struct {
int **adjMatrix;
int vertices; // 顶点数
} AdjMatrixGraph;
// 初始化邻接矩阵
void initAdjMatrix(int vertices, AdjMatrixGraph *graph) {
graph->adjMatrix = malloc(vertices * sizeof(int *));
for (int i = 0; i < vertices; i++) {
graph->adjMatrix[i] = malloc(vertices * sizeof(int));
for (int j = 0; j < vertices; j++)
graph->adjMatrix[i][j] = (i == j || !hasEdge(i, j)); // 假设无边则初始为0
}
}
// 添加边到邻接矩阵
void addEdge(int src, int dest, AdjMatrixGraph *graph) {
graph->adjMatrix[src - 1][dest - 1] = 1; // 图的索引从0开始计数
}
// 广度优先搜索
void BFS(AdjMatrixGraph graph, int start) {
int visited[graph.vertices] = {0}; // 记录已访问节点
int queue[graph.vertices]; // 使用数组模拟队列
visited[start] = 1; // 标记起始节点为已访问
queue[0] = start;
while (queue[0]) {
int current = queue[0];
printf("%d ", current); // 打印当前节点
queue[0] = queue[0 + 1]; // 移除第一个节点
// 遍历当前节点的邻居
for (int i = 0; i < graph.vertices; i++) {
if (graph.adjMatrix[current][i] && !visited[i]) {
visited[i] = 1;
queue[0 + 1] = i; // 把未访问的邻居加入队列
}
}
}
}
// 主函数示例
int main() {
int n, e; // 顶点数和边数
scanf("%d %d", &n, &e);
AdjMatrixGraph graph;
initAdjMatrix(n, &graph);
// 根据实际需求添加边
for (int i = 0; i < e; i++) {
int u, v;
scanf("%d %d", &u, &v);
addEdge(u, v, &graph);
}
int start;
scanf("%d", &start);
BFS(graph, start);
return 0;
}
```
这段代码首先初始化一个邻接矩阵,然后通过`addEdge()`函数添加边,最后调用`BFS()`函数执行广度优先搜索。注意,在实际应用中,你需要替换`hasEdge(i, j)`函数来判断具体是否有边连接两个顶点。
阅读全文