项目场景:
测试点编号 | 测试点时限 | 测试点内存 |
---|---|---|
#1 | 1s | 256m |
#2 | 1s | 256m |
#3 | 1s | 256m |
#4 | 1s | 256m |
#5 | 1s | 256m |
问题描述
火星上唯一的宇宙学校有N个课程,课程编号为1到N,有一些课程有一些前置课程。Robot上课是一门课上完再学一门新课,请你帮Robot找出一个合理的上课的序列。
输入格式
第1行2个正整数N和M,N范围[2,10000] ,M范围[0,100000]。
下面有M行,每行2个正整数a和b,表示第a课是第b课的前置知识。
数据保证有方案
输出格式
一行空格隔开的N个正整数,表示上课的序列。
输入/输出例子1
输入:
5 7
2 5
2 4
5 3
2 1
4 5
4 3
3 1
输出:
2 4 5 3 1
AC代码:
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
int n,m,in[10009];
vector<int> G[10009];
int main(){
cin >> n >> m;
for(int i = 0 ; i < m ; i ++){
int a,b;
cin >> a >> b;
G[a].push_back(b);
in[b] ++;
}
priority_queue<int,vector<int>,greater<int> > q;
int sum=n;
for(int i = 1 ; i <= n ; i ++){
if (!in[i]){
q.push(i);
sum --;
}
}
vector<int> ans;
while(!q.empty()){
int len = q.size();
for(int i = 0 ; i < len ; i ++){
int x = q.top();
q.pop();
ans.push_back(x);
for(int j = 0 ; j < G[x].size() ; j ++){
in[G[x][j]] --;
if (!in[G[x][j]]){
q.push(G[x][j]);
sum --;
}
}
}
}
if (!sum){
for(int i = 0 ; i < ans.size() ; i ++) cout << ans[i] << " ";
}
else cout << -1 << endl;
return 0;
}
原因分析:
不懂
解决方案:
想