c++ 判断无向图是否为无环树
时间: 2024-10-14 07:15:10 浏览: 37
在 C++ 中,判断一个无向图是否为一棵无环树通常需要借助拓扑排序算法,例如深度优先搜索 (DFS) 或广度优先搜索 (BFS)。以下是使用 DFS 的一种常见方法:
1. **DFS 算法**:
- 首先,对每个未访问过的节点进行递归遍历。如果遇到一个已访问过但还有未标记为前驱的节点,说明存在环路,因为在一个树结构中所有节点都应该有且仅有一个前驱节点。
- 如果能完成所有的节点遍历,并且发现所有节点都有前驱节点,且每个节点只有一个前驱,那么可以确认这是一个无环树。
2. **伪代码示例**:
```cpp
bool isTree(const vector<vector<int>>& adjList) {
// 初始化访问数组,设置所有节点为未访问
vector<bool> visited(adjList.size(), false);
// 深度优先搜索辅助函数
stack<int> dfsStack;
for (int i = 0; i < adjList.size(); ++i) {
if (!visited[i]) {
if (!dfs(adjList, visited, i, &dfsStack)) { // 返回false表示存在环路
return false;
}
}
}
// 所有的节点都进行了有效的DFS,说明是棵树且无环
return true;
}
bool dfs(const vector<vector<int>>& adjList, vector<bool>& visited, int node, stack<int>* dfsStack) {
visited[node] = true;
dfsStack.push(node);
for (const auto& neighbor : adjList[node]) {
if (!visited[neighbor]) {
if (!dfs(adjList, visited, neighbor, dfsStack)) { // 递归处理邻居
return false;
}
} else if (neighbor != dfsStack.top()) { // 如果邻居已访问并且不是当前路径的直接后继,说明有环
return false;
}
}
dfsStack.pop(); // 结束当前节点的访问
return true;
}
```
3. **
阅读全文