使用邻接矩阵存储,用c语言编写一个深度优先遍历判断有向图中是否含有回路的算法
时间: 2025-01-05 08:45:09 浏览: 19
在C语言中,你可以使用邻接矩阵来存储有向图,并借助深度优先搜索(DFS)来判断是否有环。下面是一个简单的示例:
```c
#include <stdbool.h>
#define MAX_NODES 100 // 假设最大节点数
// 图的邻接矩阵结构
typedef bool graph[MAX_NODES][MAX_NODES];
// 检测环路的DFS函数
bool hasCycle(graph adj, int v, bool visited[]) {
visited[v] = true; // 标记当前节点已访问
for (int i = 0; i < MAX_NODES; i++) {
if (adj[v][i] && !visited[i]) { // 如果有边且未访问
if (hasCycle(adj, i, visited)) { // 递归检查邻居
return true; // 找到了环
}
} else if (adj[v][i] && visited[i]) { // 如果有边但邻居已被访问过
// 有环(假设环是从v开始,然后通过i到达v)
return true;
}
}
return false; // 节点v没有环
}
// 主函数用于测试
int main() {
int nodes, edges;
scanf("%d %d", &nodes, &edges); // 输入节点数和边的数量
graph g = {false}; // 初始化全为false的邻接矩阵
for (int i = 0; i < edges; i++) {
int u, v;
scanf("%d %d", &u, &v);
g[u][v] = true; // 存储边的方向
}
bool *visited = new bool[MAX_NODES]; // 初始化已访问数组
for (int i = 0; i < nodes; i++) {
if (!visited[i] && hasCycle(g, i, visited)) {
printf("有环\n");
break;
}
}
delete[] visited;
return 0;
}
```
这个程序会读取输入的节点和边,构建邻接矩阵,然后对每个节点进行深度优先搜索。如果有环,则会返回`true`并打印“有环”。如果没有找到环,整个数组都会被检查完才会退出。
**相关问题--:**
1. 这个算法的时间复杂度是多少?
2. 如何处理边的数量远大于节点数量的情况?
3. 如果图中存在多个环,这个程序能够检测出来吗?
阅读全文