假设以邻接矩阵作为图的存储结构,编写算法判别给定的有向图中是否存在回路。C++代码实现
时间: 2024-12-20 16:31:33 浏览: 15
在C++中,可以使用欧拉图检测算法(如Kosaraju's Strongly Connected Components Algorithm)或者更简单地利用拓扑排序来判断有向图是否存在环。以下是一种基于拓扑排序的快速检测环的方法:
```cpp
#include <iostream>
#include <vector>
#include <queue>
// 定义一个有向图节点
struct Node {
int id;
vector<int> edges;
};
bool hasCycle(Node* nodes, int n) {
// 使用拓扑排序,如果无法得到拓扑序列,则存在环
vector<int> inDegree(n, 0); // 记录每个节点的入度
queue<int> q;
for (int i = 0; i < n; ++i) {
for (int j : nodes[i].edges) {
++inDegree[j];
}
if (inDegree[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int curr = q.front();
q.pop();
for (int next : nodes[curr].edges) {
if (--inDegree[next] == 0) {
q.push(next);
}
}
}
// 若所有节点都出队了,说明图中不存在环
return inDegree.size() != n;
}
int main() {
int numNodes;
cin >> numNodes;
Node nodes[numNodes];
// 输入节点及其边信息
for (int i = 0; i < numNodes; ++i) {
cin >> nodes[i].id;
int numEdges;
cin >> numEdges;
nodes[i].edges.resize(numEdges);
for (int j = 0; j < numEdges; ++j) {
int edge;
cin >> edge;
nodes[i].edges[j] = edge;
}
}
bool hasLoop = hasCycle(nodes, numNodes);
cout << (hasLoop ? "存在环" : "无环") << endl;
return 0;
}
```
这个代码首先计算每个节点的入度,然后从入度为0的节点开始,每次处理完一个节点就检查它的出度相邻节点的入度是否减少为0,若如此则将该节点出队。最后,如果还有节点没有出队,说明图中有环;反之则无环。
阅读全文