//图算法
//题目:
//给定一个有向图,判断是否存在环。
//
//问题函数定义:
//
//cpp
//bool hasCycle(vector<vector<int>>& graph);
//裁判测试程序样例:
//
//cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool hasCycle(vector<vector<int>>& graph) {
vector<int> vit(graph.size(), 0);
vector<int> degree(graph.size(), 0);
// 计算每个节点的入度
for (int i = 0; i < graph.size(); i++) {
for (int j = 0; j < graph[i].size(); j++) {
degree[graph[i][j]]++;
}
}
queue<int> q;
// 将入度为0的节点入队列
for (int i = 0; i < graph.size(); i++) {
if (degree[i] == 0) {
q.push(i);
}
}
int visitedNodes = 0; // 记录访问过的节点数
while (!q.empty()) {
int curNode = q.front();
q.pop();
visitedNodes++;
vit[curNode] = 1;
// 更新邻居节点的入度,并将入度变为0的节点入队列
for (int neighbor : graph[curNode]) {
degree[neighbor]--;
if (degree[neighbor] == 0&&vit[neighbor]==0) {
q.push(neighbor);
}
}
}
// 如果访问过的节点数等于图中的节点数,则说明不存在环
return visitedNodes != graph.size();
}
int main() {
vector<vector<int>> graph = { {1, 2}, {2}, {3}, {4}, {} };
if (hasCycle(graph)) {
cout << "图中存在环。" << endl;
}
else {
cout << "图中不存在环。" << endl;
}
return 0;
}
//输入样例:
//
//有向图: [[1, 2], [2], [3], [4], []]
//输出样例:
//
//图中不存在环。