#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main(){
int n;
cin>>n;
vector<vector<int>> nxs(n);
vector<int> indegree(n);
for(int i=0;i<n;i++){
int num;
cin>>num;
indegree[i]=num;
//将当前节点的所依赖的模块都都放进来,即把它的父节点放进来
for(int j=0;j<num;j++){
int parent;
cin>>parent;
int parentpos=parent-1;
nxs[parentpos].push_back(i);
}
}
queue<int> q;
//将入度为0的模块压入队列中
for(int i=0;i<n;i++){
if(indegree[i]==0) {q.push(i);}
}
int cnt=0, deletenum=0;
while(!q.empty()){
cnt++; //统计轮次
int len = q.size();
deletenum += len;
for(int i=0;i<len;i++){
int cur = q.front();q.pop();
for(int nx : nxs[cur]){ //寻找下一层要输出的模块
indegree[nx]--; //将下一层要输出模块的入度减一
if(indegree[nx]==0)
q.push(nx);
}
}
}
if(deletenum==n) cout<<cnt<<endl;
else cout<<-1<<endl;
return 0;
}
参考博文:https://blog.csdn.net/a_beatiful_knife/article/details/130395236