https://ac.nowcoder.com/acm/contest/57357/J
拓扑排序
#include<bits/stdc++.h>
using namespace std;
vector<int> edge[1000005];
int in[1000005];
queue<int> q,ans;
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
edge[u].push_back(v);
in[v]++;
}
for(int i=1;i<=n;i++){
if(in[i]==0) q.push(i);
}
while(!q.empty()){
int x=q.front();
for(int i=0;i<edge[x].size();i++){
in[edge[x][i]]--;
if(in[edge[x][i]]==0){
q.push(edge[x][i]);
}
}
ans.push(x);
q.pop();
}
if(ans.size()==n){
cout<<"1"<<endl;
while(!ans.empty()){
cout<<ans.front()<<" ";
ans.pop();
}
}
else{
cout<<"2"<<endl;
for(int i=1;i<=n;i++){
cout<<i<<" ";
}
cout<<endl;
for(int i=n;i>=1;i--){
cout<<i<<" ";
}
}
}