C++语言,利用邻接矩阵创建无向图实现DFS和BFS,使用队列头文件
时间: 2024-05-07 14:18:41 浏览: 118
下面是基于邻接矩阵的无向图的DFS和BFS算法实现,使用了队列头文件:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <limits.h>
#define MAX_VERTICES 100 // 最大顶点数量
#define INF INT_MAX // 定义正无穷
// 图的邻接矩阵结构体
typedef struct {
int matrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
int n; // 图的顶点数量
} Graph;
// 初始化图
void init_graph(Graph *g, int n) {
g->n = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g->matrix[i][j] = INF; // 初始化为正无穷
}
}
}
// 添加边
void add_edge(Graph *g, int u, int v, int w) {
g->matrix[u][v] = w;
g->matrix[v][u] = w; // 无向图,对称矩阵
}
// DFS遍历
void dfs(Graph *g, int v, bool visited[]) {
visited[v] = true;
printf("%d ", v);
for (int i = 0; i < g->n; i++) {
if (g->matrix[v][i] != INF && !visited[i]) {
dfs(g, i, visited);
}
}
}
// BFS遍历
void bfs(Graph *g, int v, bool visited[]) {
int queue[MAX_VERTICES];
int front = 0, rear = 0;
queue[rear++] = v;
visited[v] = true;
while (front < rear) {
int cur = queue[front++];
printf("%d ", cur);
for (int i = 0; i < g->n; i++) {
if (g->matrix[cur][i] != INF && !visited[i]) {
queue[rear++] = i;
visited[i] = true;
}
}
}
}
int main() {
Graph g;
int n, m;
printf("请输入顶点数量和边数量:");
scanf("%d%d", &n, &m);
init_graph(&g, n);
printf("请输入每条边的起点、终点和权重:\n");
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add_edge(&g, u, v, w);
}
bool visited[MAX_VERTICES] = {false}; // 初始化所有顶点未被访问
printf("DFS遍历:");
for (int i = 0; i < g.n; i++) {
if (!visited[i]) {
dfs(&g, i, visited);
}
}
printf("\nBFS遍历:");
memset(visited, false, sizeof(visited)); // 重置所有顶点未被访问
for (int i = 0; i < g.n; i++) {
if (!visited[i]) {
bfs(&g, i, visited);
}
}
return 0;
}
```
在输入顶点数量和边数量后,依次输入每条边的起点、终点和权重,即可输出DFS和BFS遍历结果。
阅读全文