根据拓扑排序中是否所有点都入队(可形成拓扑序)来判断是否有回路
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
queue<int>q;
int cnt = 0;
vector<int>indegree(1000,0); //数组记录每个点的入度
vector<int>Adj[1000]; //邻接表
int n,m;
cin >> n>>m;
for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
Adj[u].push_back(v);
indegree[v]++; //计算每个点的入度
}
for (int i =1;i <= n; i++)
{
if (indegree[i] == 0)
{
q.push(i); //初始化,将所有入度为0的点放入队列
}
}
while (!q.empty())
{
int u = q.front();
for (int j = 0; j < Adj[u].size(); j++)
{
indegree[Adj[u][j]]--; //将队首指向的点的入度减一
}
for (int j = 0; j <Adj[u].size(); j++)
{
if (indegree[Adj[u][j]]== 0 )
{
q.push(Adj[u][j]); //更新队列
}
}
q.pop();cnt++; //队首元素弹出,记录个数
}
if (cnt < n)cout << "有环"; //如果所有点均入过队列,则无环,否则有环
else cout << "无环";
return 0;
}