题目来源
题目描述
题目解析
拓扑排序,检测有没有环
#include <iostream>
#include <utility>
#include <vector>
#include <random>
#include <iterator>
#include <map>
#include <algorithm>
#include <set>
#include <bitset>
#include <queue>
#include <iostream>
using namespace std;
std::vector<std::vector<int>> List;
int main(){
int N;
std::cin >> N;
// 0
std::vector<int> degree(N, 0);
std::map<int, std::set<int>> map;
int begin, end;
while (cin >> begin){
cin >> end;
if(begin < 0 && begin > N || end < 0 && end > N){
std::cout << -1 << "\n";
return 0;
}
map[begin].insert(end);
degree[end]++;
}
std::queue<int> queue;
for (int i = 0; i < degree.size(); ++i) {
if(degree[i] == 0){
queue.push(i);
}
}
while (!queue.empty()){
auto front = queue.front(); queue.pop();
for(auto n : map[front]){
--degree[n];
if(degree[n] == 0){
queue.push(n);
}
}
}
bool flag = true;
for (int i : degree) {
if(i != 0){
flag = false;
break;
}
}
if(flag){
std::cout << "yes";
}else{
std::cout << -1 << "\n";
}
return 0;
}