用C++写一个DFS算法
时间: 2023-09-18 14:06:26 浏览: 97
### 回答1:
深度优先搜索(DFS)算法是一种图形搜索算法,它可以让您遍历图中的所有节点。它从图中的某个节点开始,并沿着图中的路径搜索,直到搜索到所有的节点为止。使用C语言来实现DFS算法,首先要定义一个图的数据结构,然后定义一个DFS函数,该函数从指定的节点开始,并遍历所有的节点。实现DFS算法的具体步骤如下:
1. 初始化访问标记数组
2. 从指定的节点开始,将其访问标记设置为“已访问”
3. 对该节点的所有邻接节点进行检查,如果没有被访问过,则调用DFS函数,以该节点为起点继续搜索
4. 当没有可以访问的节点时,返回上一层节点,继续搜索
5. 当所有节点都被访问过时,算法结束
### 回答2:
深度优先搜索(DFS)是一种常用的图遍历算法,通过不断深入直到无法继续深入,然后回溯到上一个节点,继续遍历。
下面是使用C语言编写的DFS算法的示例代码:
```c
#include <stdio.h>
#define MAX_SIZE 100
#define UNVISITED 0
#define VISITED 1
int graph[MAX_SIZE][MAX_SIZE]; // 图的邻接矩阵
int visited[MAX_SIZE]; // 记录节点是否已访问
void DFS(int vertex, int num_nodes) {
printf("%d ", vertex); // 访问节点vertex
visited[vertex] = VISITED; // 将节点vertex标记为已访问
for (int i = 0; i < num_nodes; i++) {
if (graph[vertex][i] == 1 && visited[i] == UNVISITED) { // 若节点i与vertex相连且未访问过
DFS(i, num_nodes); // 递归访问节点i
}
}
}
int main() {
int num_nodes, num_edges;
printf("请输入节点数和边数:");
scanf("%d%d", &num_nodes, &num_edges);
// 初始化图的邻接矩阵
for (int i = 0; i < num_nodes; i++) {
visited[i] = UNVISITED;
for (int j = 0; j < num_nodes; j++) {
graph[i][j] = 0;
}
}
printf("请输入边的信息:\n");
for (int i = 0; i < num_edges; i++) {
int start, end;
printf("边%d的起点和终点:", i + 1);
scanf("%d%d", &start, &end);
graph[start][end] = 1; // 在邻接矩阵中标记边的存在
}
int start_vertex;
printf("请输入起始节点:");
scanf("%d", &start_vertex);
printf("DFS遍历结果:");
DFS(start_vertex, num_nodes);
return 0;
}
```
以上代码实现了一个基本的DFS算法,通过邻接矩阵表示图的连接关系。用户需要输入节点数、边数以及边的起点和终点信息。之后需要输入起始节点,程序将输出DFS遍历的结果。
### 回答3:
深度优先搜索(Depth-First Search,简称DFS)是一种常用的图搜索算法,适用于解决许多与图相关的问题。对于有向或无向图,DFS可以在其所有节点上进行深入搜索,直到达到最深的节点为止,然后回溯到之前的节点继续搜索。
下面是用C语言实现的DFS算法的示例:
```c
#include<stdio.h>
#define MAX_VERTEX 100 // 图中最大顶点数
#define MAX_STACK_SIZE 100 // 栈的最大容量
int visited[MAX_VERTEX]; // 记录节点是否已访问
int graph[MAX_VERTEX][MAX_VERTEX]; // 图的邻接矩阵表示
int vertexNum; // 图中顶点数
typedef struct {
int data[MAX_STACK_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *stack) {
stack->top = -1;
}
// 入栈
void push(Stack *stack, int value) {
if (stack->top < MAX_STACK_SIZE - 1) {
stack->data[++(stack->top)] = value;
}
}
// 出栈
int pop(Stack *stack) {
int value = -1;
if (stack->top >= 0) {
value = stack->data[(stack->top)--];
}
return value;
}
// 深度优先搜索
void dfs(int start) {
Stack stack;
initStack(&stack);
push(&stack, start);
visited[start] = 1;
while (stack.top != -1) {
int current = pop(&stack);
printf("%d ", current);
for (int i = 0; i < vertexNum; i++) {
if (graph[current][i] && !visited[i]) {
push(&stack, i);
visited[i] = 1;
}
}
}
}
int main() {
int edges, start;
printf("请输入顶点数和边数:");
scanf("%d %d", &vertexNum, &edges);
printf("请输入边的连接关系:\n");
for (int i = 0; i < edges; i++) {
int u, v;
scanf("%d %d", &u, &v);
graph[u][v] = 1;
graph[v][u] = 1; // 如果是有向图则不需要这一行
}
printf("请输入起始顶点:");
scanf("%d", &start);
printf("深度优先搜索结果为:");
dfs(start);
return 0;
}
```
以上示例中,我们首先定义了一个栈结构,用于存储待访问的节点。通过栈的先进后出特性,可以实现深度优先搜索。在主函数中,我们首先读取用户输入的图的顶点数和边数,然后读取每条边的连接关系,构建邻接矩阵表示的图。接下来,我们输入起始顶点,并调用dfs()函数进行深度优先搜索。在dfs()函数中,我们使用一个循环不断取栈顶元素进行处理,同时将未访问的邻接节点入栈。最后,打印搜索结果即可。
请注意,以上代码仅为示例,可能需要根据具体问题的要求进行适当的修改与优化。
阅读全文