848. 有向图的拓扑序列
题目链接https://www.acwing.com/problem/content/850/
题目:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e5+10;
int n,m;
int a[N];
int qu[N];
vector<int >q[N];
bool solve(){
int f=0,r=-1;
for(int i=1;i<=n;i++){
if(!a[i]) qu[++r]=i;
}
while(f<=r){
int t=qu[f++];
for(int i=0;i<q[t].size();i++){
a[q[t][i]]--;
if(a[q[t][i]]==0) qu[++r]=q[t][i];
}
}
if(r==n-1) return true;
return false;
}
int main(){
cin>>n>>m;
int x,y;
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
a[y]++;
q[x].push_back(y);
}
if(solve()){
cout<<qu[0];
for(int i=1;i<n;i++)
printf(" %d",qu[i]);
}else{
cout<<-1;
}
return 0;
}