能写一个c语言深读度优先搜索的程序吗
时间: 2023-09-17 07:05:54 浏览: 66
### 回答1:
当然可以!
以下是一个示例的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 20
#define MAX_EDGE_NUM 40
typedef struct Edge {
int start, end;
} Edge;
Edge edges[MAX_EDGE_NUM];
int num_edges = 0;
int in_degree[MAX_VERTEX_NUM];
void add_edge(int start, int end) {
edges[num_edges].start = start;
edges[num_edges].end = end;
++in_degree[end];
++num_edges;
}
bool dfs(int vertex, bool visited[], int order[], int *order_index) {
visited[vertex] = true;
for (int i = 0; i < num_edges; ++i) {
int end = edges[i].end;
if (edges[i].start == vertex && !visited[end]) {
if (!dfs(end, visited, order, order_index)) {
return false;
}
}
}
order[(*order_index)++] = vertex;
return true;
}
bool topological_sort(int num_vertices, int order[]) {
int order_index = 0;
bool visited[MAX_VERTEX_NUM];
for (int i = 0; i < num_vertices; ++i) {
visited[i] = false;
}
for (int i = 0; i < num_vertices; ++i) {
if (!visited[i]) {
if (!dfs(i, visited, order, &order_index)) {
return false;
}
}
}
return true;
}
int main(void) {
int num_vertices;
scanf("%d", &num_vertices);
int a, b;
while (scanf("%d%d", &a, &b) == 2) {
add_edge(a, b);
}
int order[MAX_VERTEX_NUM];
if (topological_sort(num_vertices, order)) {
for (int i = 0; i < num_vertices; ++i) {
printf("%d ", order[i]);
}
printf("\n");
} else {
printf("There's a cycle in the graph.\n");
}
return 0;
}
```
这个程序实现了深度优先搜索算法对有向图的拓扑排序。读入的图可以有环,在输出拓扑序列的同时判断图是否有
### 回答2:
当然可以写一个C语言深度优先搜索的程序。下面是一个示例程序:
```c
#include <stdio.h>
#define MAX_NODES 100
int visited[MAX_NODES];
int adjacencyMatrix[MAX_NODES][MAX_NODES];
int numNodes;
void DFS(int node) {
visited[node] = 1;
printf("%d ", node);
for (int i = 0; i < numNodes; i++) {
if (adjacencyMatrix[node][i] && !visited[i]) {
DFS(i);
}
}
}
void initialize() {
for (int i = 0; i < MAX_NODES; i++) {
visited[i] = 0;
for (int j = 0; j < MAX_NODES; j++) {
adjacencyMatrix[i][j] = 0;
}
}
}
int main() {
int numEdges;
int startNode;
printf("输入节点数: ");
scanf("%d", &numNodes);
printf("输入边数: ");
scanf("%d", &numEdges);
initialize();
printf("输入边的顶点: \n");
for (int i = 0; i < numEdges; i++) {
int u, v;
scanf("%d %d", &u, &v);
adjacencyMatrix[u][v] = 1;
adjacencyMatrix[v][u] = 1; // 如果是有向图则不需要这行
}
printf("选择起始节点: ");
scanf("%d", &startNode);
printf("深度优先搜索结果: ");
DFS(startNode);
return 0;
}
```
这个程序通过邻接矩阵表示图的连接关系,使用深度优先搜索算法遍历图中的节点,并使用递归调用来遍历未访问的相邻节点。其中,`visited`数组用于记录节点是否已访问,`adjacencyMatrix`用于存储节点之间的连接关系。在输入过程中,需要提供节点数、边数以及每条边的顶点信息。最后,通过选择起始节点,程序输出深度优先搜索的结果。
### 回答3:
当然可以!下面是一个示例的C语言深度优先搜索程序:
```c
#include <stdio.h>
#define MAX_SIZE 100
int graph[MAX_SIZE][MAX_SIZE]; // 图的邻接矩阵表示
int visited[MAX_SIZE]; // 记录节点是否被访问
// 深度优先搜索函数
void DFS(int node, int numNodes) {
visited[node] = 1; // 将当前节点标记为已访问
printf("%d ", node); // 输出当前节点的值
// 遍历当前节点的邻接节点
for (int i = 0; i < numNodes; i++) {
if (graph[node][i] == 1 && !visited[i]) { // 如果该节点与当前节点相连且未被访问
DFS(i, numNodes); // 递归调用DFS函数,继续深度优先搜索邻接节点
}
}
}
int main() {
int numNodes; // 图中节点的个数
printf("请输入节点的个数: ");
scanf("%d", &numNodes);
// 输入图的邻接矩阵
printf("请输入邻接矩阵:\n");
for (int i = 0; i < numNodes; i++) {
for (int j = 0; j < numNodes; j++) {
scanf("%d", &graph[i][j]);
}
}
// 初始化visited数组
for (int i = 0; i < numNodes; i++) {
visited[i] = 0;
}
printf("深度优先搜索结果: ");
for (int i = 0; i < numNodes; i++) {
if (!visited[i]) { // 如果节点未被访问
DFS(i, numNodes); // 从该节点开始进行深度优先搜索
}
}
printf("\n");
return 0;
}
```
该程序中,我们首先输入图的节点个数和邻接矩阵,然后使用深度优先搜索算法来遍历图中的节点。其中,DFS函数用于递归地进行深度优先搜索,visited数组用于记录每个节点是否被访问过。在程序运行结束后,会输出深度优先搜索的结果。
请注意,由于输入和邻接矩阵大小的限制,此程序的图最大为100个节点,可以根据需求进行调整。