C++解决无向图含点1的最短环长度的代码
时间: 2024-10-21 15:04:16 浏览: 10
在C++中,要解决无向图中只含一个顶点(孤岛节点)的最短环长度问题,实际上并不需要复杂的算法,因为这样的图不可能存在环路。如果图只有一个顶点,那么它的“最短环长度”就是0,因为不存在环。
但是,如果你想要处理更一般的情况,比如查找任意有向图中是否存在环,可以使用拓扑排序。如果没有环,则会得到一个空序列,表示没有环;如果有环,则最后一个访问的节点将是形成环的第一个节点。在这个场景下,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)配合队列来判断是否有环。
这里是一个简单的示例,展示如何检查一个有向图是否包含环:
```cpp
#include <iostream>
#include <vector>
#include <unordered_set>
bool hasCycleUtil(const std::vector<std::vector<int>>& adjList, int start, std::vector<bool>& visited) {
visited[start] = true;
for (int neighbor : adjList[start]) {
if (!visited[neighbor]) {
if (hasCycleUtil(adjList, neighbor, visited)) return true; // 如果邻居存在环则返回true
} else if (visited[neighbor] && neighbor != start) { // 遇到已访问过的节点,说明存在环
return true;
}
}
visited[start] = false; // 访问结束后回溯标记
return false;
}
bool hasCycle(const std::vector<std::vector<int>>& adjList) {
std::vector<bool> visited(adjList.size(), false);
for (int i = 0; i < adjList.size(); ++i) {
if (!visited[i] && hasCycleUtil(adjList, i, visited)) {
return true;
}
}
return false;
}
int main() {
std::vector<std::vector<int>> graph = {{1, 2}, {2, 3}, {4, 5}}; // 示例有向图
if (hasCycle(graph)) {
std::cout << "Graph contains a cycle.\n";
// 对于无环情况,这里不会打印,因为只有一个顶点
} else {
std::cout << "Graph does not contain a cycle.\n";
}
return 0;
}
```
注意,这个例子适用于有向图,如果是指无向图,只需要把`adjList[start]`改为`adjList[start].begin()`到`adjList[start].end()`即可。但如前所述,对于只有单个顶点的无向图,这个问题无需特殊处理。
阅读全文