C语言编程题: 在一个有向图中: 1、不用拓扑排序,请设计算法判断该图中是否存在回路。请先写明算法思想,再完成相应的功能函数的定义。
时间: 2024-02-13 21:00:41 浏览: 187
算法思想:
使用深度优先搜索(DFS)遍历图,对于每个节点,记录其在当前DFS遍历中是否被访问过以及是否处于当前DFS遍历的路径上。如果一个节点在当前DFS遍历的路径上已经被访问过,那么就说明存在回路。
具体实现时,可以使用一个布尔型数组visited[]来记录每个节点是否被访问过,在进行DFS遍历时,先将当前节点标记为visited,然后遍历当前节点的所有出边所指向的节点,如果在遍历过程中发现某个节点已经被visited并且处于路径上,那么就说明存在回路。
代码实现:
```c
#include <stdbool.h>
#define MAX_NODES 1000
// 定义一个函数,判断有向图是否存在回路
// 输入参数:
// graph: 有向图,使用邻接表表示,graph[i]表示节点i的所有出边所连接的节点
// num_nodes: 节点数目
// 返回值:
// 存在回路返回true,否则返回false
bool has_cycle(int **graph, int num_nodes) {
bool visited[MAX_NODES] = { false };
bool on_path[MAX_NODES] = { false };
bool dfs(int node) {
visited[node] = true;
on_path[node] = true;
for (int i = 0; i < num_nodes; i++) {
if (graph[node][i]) {
if (on_path[i]) {
return true;
} else if (!visited[i]) {
if (dfs(i)) {
return true;
}
}
}
}
on_path[node] = false;
return false;
}
for (int i = 0; i < num_nodes; i++) {
if (!visited[i]) {
if (dfs(i)) {
return true;
}
}
}
return false;
}
```
阅读全文