用c语言写一下程序:找出所有可行路径,并且输出
时间: 2024-03-01 13:52:14 浏览: 153
好的,我可以帮你编写一个 C 语言程序,用于查找一个图中的所有可行路径,并输出它们。假设我们的图是一个邻接矩阵,其中 0 表示两个节点之间没有边,1 表示有边。
以下是程序的基本框架:
```c
#include <stdio.h>
#define MAX_VERTICES 100
#define TRUE 1
#define FALSE 0
int adj[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
int visited[MAX_VERTICES]; // 标记节点是否被访问过
int path[MAX_VERTICES]; // 保存当前路径
void find_all_paths(int start, int end, int path_len) {
// TODO: 实现查找所有可行路径的递归函数
}
int main() {
int num_vertices; // 节点数
int start, end; // 起点和终点
// TODO: 读入邻接矩阵和其他参数
// 调用递归函数查找所有可行路径
return 0;
}
```
在 `find_all_paths` 函数中,我们使用递归的方式来查找所有可行路径。具体实现如下:
```c
void find_all_paths(int start, int end, int path_len) {
int i;
visited[start] = TRUE;
path[path_len] = start;
path_len++;
if (start == end) { // 找到一条路径
printf("Path: ");
for (i = 0; i < path_len; i++) {
printf("%d ", path[i]);
}
printf("\n");
} else { // 继续查找
for (i = 0; i < num_vertices; i++) {
if (adj[start][i] && !visited[i]) {
find_all_paths(i, end, path_len);
}
}
}
// 恢复状态
visited[start] = FALSE;
path_len--;
}
```
该函数接受三个参数:起点 `start`、终点 `end` 和当前路径的长度 `path_len`。首先将起点标记为已访问,并将它加入到当前路径中。然后判断起点是否为终点,如果是,则输出当前路径;否则,遍历与该节点相邻的节点,递归地查找路径。最后,恢复状态,继续查找其他路径。
在 `main` 函数中,我们需要读入邻接矩阵和其他参数,然后调用 `find_all_paths` 函数来查找所有可行路径。完整的程序如下所示:
```c
#include <stdio.h>
#define MAX_VERTICES 100
#define TRUE 1
#define FALSE 0
int adj[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
int visited[MAX_VERTICES]; // 标记节点是否被访问过
int path[MAX_VERTICES]; // 保存当前路径
int num_vertices; // 节点数
void find_all_paths(int start, int end, int path_len) {
int i;
visited[start] = TRUE;
path[path_len] = start;
path_len++;
if (start == end) { // 找到一条路径
printf("Path: ");
for (i = 0; i < path_len; i++) {
printf("%d ", path[i]);
}
printf("\n");
} else { // 继续查找
for (i = 0; i < num_vertices; i++) {
if (adj[start][i] && !visited[i]) {
find_all_paths(i, end, path_len);
}
}
}
// 恢复状态
visited[start] = FALSE;
path_len--;
}
int main() {
int i, j;
int start, end;
// 读入邻接矩阵和其他参数
printf("Enter the number of vertices: ");
scanf("%d", &num_vertices);
printf("Enter the adjacency matrix:\n");
for (i = 0; i < num_vertices; i++) {
for (j = 0; j < num_vertices; j++) {
scanf("%d", &adj[i][j]);
}
}
printf("Enter the start and end vertices: ");
scanf("%d %d", &start, &end);
// 初始化状态
for (i = 0; i < num_vertices; i++) {
visited[i] = FALSE;
}
// 调用递归函数查找所有可行路径
find_all_paths(start, end, 0);
return 0;
}
```
当你运行这个程序时,它会提示你输入一些参数,包括节点数、邻接矩阵和起点、终点。然后它会输出所有可行路径。
阅读全文