输入:[[0,1,0],[0,0,1],[1,0,0]]
输出:1
解释:1->2->3->1构成一个环,所以返回1表示有环
输入:[[0,1,0],[0,0,1],[0,0,0]]
输出:0
解释:1->2->3,这是一条拓扑路径,所以返回0表示没有环
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<sstream>
using namespace std;
bool ExistLoop(const vector<vector<bool>>& AdajstGraph){
int Length = AdajstGraph.size();
vector<int> in(Length,0);
queue<int> q;
for(int i = 0;i < Length;i ++){
for(int j = 0;j < Length;j ++){
if(AdajstGraph[j][i] == 1){
in[i]++;
}
}
}
for(int i = 0;i < Length;i ++){
if(in[i] == 0){
q.push(i);
}
}
int NumOfList = 0;
while(!q.empty()){
int p = q.front();
q.pop();
NumOfList++;
for(int i = 0;i < Length;i ++){
if(AdajstGraph[p][i] == 1){
in[i]--;
if(in[i] == 0){
q.push(i);
}
}
}
}
return NumOfList != Length;
}
int main(){
string s;
vector<vector<bool>> AdajstGraph;
getline(cin,s);
for(int i = 1;i < s.length();i ++){
if(s[i] == '['){
AdajstGraph.push_back(vector<bool>());
}
else if(s[i] == '0' || s[i] == '1'){
AdajstGraph.back().push_back(s[i] - '0');
}
}
if(ExistLoop(AdajstGraph)){
printf("1\n");
}
else{
printf("0\n");
}
return 0;
}