图的深度优先算法、广度优先算法c语言实现。
时间: 2024-04-27 13:18:00 浏览: 138
图的深度优先遍历与广度优先遍历(C语言实现)
5星 · 资源好评率100%
深度优先搜索(Depth First Search,DFS)和广度优先搜索(Breadth First Search,BFS)是图的两种常见遍历算法。
深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。它从根节点开始,沿着一条路径尽可能深入地访问节点,直到达到叶子节点或无法继续前进为止,然后回溯到前一个节点,继续探索其他路径。DFS可以使用递归或栈来实现。
以下是C语言实现深度优先搜索的示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 图的邻接矩阵表示
int graph[MAX_SIZE][MAX_SIZE];
bool visited[MAX_SIZE]; // 记录节点是否被访问过
// 深度优先搜索函数
void DFS(int vertex, int num_vertices) {
visited[vertex] = true;
printf("%d ", vertex);
for (int i = 0; i < num_vertices; i++) {
if (graph[vertex][i] && !visited[i]) {
DFS(i, num_vertices);
}
}
}
int main() {
int num_vertices, num_edges;
printf("请输入图的顶点数和边数:");
scanf("%d %d", &num_vertices, &num_edges);
// 初始化图的邻接矩阵
for (int i = 0; i < num_vertices; i++) {
for (int j = 0; j < num_vertices; j++) {
graph[i][j] = 0;
}
visited[i] = false;
}
// 读取边的信息
printf("请输入边的信息(起点 终点):\n");
for (int i = 0; i < num_edges; i++) {
int start, end;
scanf("%d %d", &start, &end);
graph[start][end] = 1;
graph[end][start] = 1; // 若是无向图,需要设置对称的边
}
int start_vertex;
printf("请输入起始顶点:");
scanf("%d", &start_vertex);
printf("深度优先搜索结果:");
DFS(start_vertex, num_vertices);
return 0;
}
```
广度优先搜索(BFS)是一种用于遍历或搜索树或图的算法。它从根节点开始,逐层地访问节点,先访问当前层的所有节点,然后再访问下一层的节点。BFS可以使用队列来实现。
以下是C语言实现广度优先搜索的示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 图的邻接矩阵表示
int graph[MAX_SIZE][MAX_SIZE];
bool visited[MAX_SIZE]; // 记录节点是否被访问过
// 广度优先搜索函数
void BFS(int start_vertex, int num_vertices) {
int queue[MAX_SIZE];
int front = 0, rear = 0;
visited[start_vertex] = true;
printf("%d ", start_vertex);
queue[rear++] = start_vertex;
while (front < rear) {
int vertex = queue[front++];
for (int i = 0; i < num_vertices; i++) {
if (graph[vertex][i] && !visited[i]) {
visited[i] = true;
printf("%d ", i);
queue[rear++] = i;
}
}
}
}
int main() {
int num_vertices, num_edges;
printf("请输入图的顶点数和边数:");
scanf("%d %d", &num_vertices, &num_edges);
// 初始化图的邻接矩阵
for (int i = 0; i < num_vertices; i++) {
for (int j = 0; j < num_vertices; j++) {
graph[i][j] = 0;
}
visited[i] = false;
}
// 读取边的信息
printf("请输入边的信息(起点 终点):\n");
for (int i = 0; i < num_edges; i++) {
int start, end;
scanf("%d %d", &start, &end);
graph[start][end] = 1;
graph[end][start] = 1; // 若是无向图,需要设置对称的边
}
int start_vertex;
printf("请输入起始顶点:");
scanf("%d", &start_vertex);
printf("广度优先搜索结果:");
BFS(start_vertex, num_vertices);
return 0;
}
```
希望对你有所帮助!
阅读全文