c预言 设计一个算法,试基于深度优先搜索判断以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。多组数据,每组m+3数据行。第一行有两个数字n和m,代表有n个顶点和m条边。第二行有n个字符,代表n个顶点的编号。第三行到第m+2行每行有两个字符h和k,代表边依附的两个顶点。第m+3行有两个字符vi和vj,代表需要判断的两个顶点。当n和m都等于0时,输入结束。每组数据输出一行。若存在路径输出“YES”,反之输出“NO”。
时间: 2024-03-24 08:41:54 浏览: 57
以下是基于深度优先搜索的算法实现,具体注释见代码中:
```c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define MAXN 100
// 定义一个函数用于判断是否存在从起点到终点的路径
bool DFS(int start, int end, bool visited[], int adj_list[][MAXN]) {
// 如果起点和终点相同,则存在路径
if (start == end) {
return true;
}
// 标记当前节点已经访问过
visited[start] = true;
// 遍历当前节点的所有邻居节点
for (int i = 0; i < MAXN; i++) {
if (adj_list[start][i] && !visited[i]) {
// 如果邻居节点没有被访问过,则递归访问该邻居节点
if (DFS(i, end, visited, adj_list)) {
return true;
}
}
}
// 如果所有邻居节点都被访问过且没有找到终点,则不存在路径
return false;
}
int main() {
int n, m;
char vertexes[MAXN][2], start[2], end[2];
int adj_list[MAXN][MAXN];
bool visited[MAXN];
while (true) {
// 读入输入数据
scanf("%d%d", &n, &m);
if (n == 0 && m == 0) {
break;
}
// 读入顶点编号
for (int i = 0; i < n; i++) {
scanf("%s", vertexes[i]);
}
// 初始化邻接表
memset(adj_list, 0, sizeof(adj_list));
// 建立邻接表
for (int i = 0; i < m; i++) {
char h[2], k[2];
scanf("%s%s", h, k);
// 将边的起点添加到终点的邻接表中
adj_list[h[0] - 'a'][k[0] - 'a'] = 1;
}
// 读入需要判断的起点和终点
scanf("%s%s", start, end);
// 判断是否存在路径,并输出结果
memset(visited, false, sizeof(visited));
if (DFS(start[0] - 'a', end[0] - 'a', visited, adj_list)) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}
```
注意,此算法的时间复杂度为 $O(nm)$,其中 $n$ 是顶点数,$m$ 是边数。
阅读全文