N个小朋友,编号 1~N,要排成一队。在安排每个人的顺序时,有 M 个要求,每个要求包含两个整数 a,b,表示小朋友 a 要排在小朋友 b 的前面。
请你找出符合所有要求的排队顺序。
输入格式
第一行包含整数 N,M。接下来 M 行,每行包含两个整数 a,b。
输出格式
按排好队列从前到后的顺序在一行内输出每个小朋友的编号。保证至少存在一个符合条件的顺序。当符合条件的排队顺序不唯一时,编号更小的小朋友尽量更靠前。
数据范围
1≤N≤500,
1≤M≤5000,
1≤a,b≤N,
保证数对 (a,b) 各不相同。
输入样例:
4 3
1 2
2 3
4 3
输出样例:
1 2 4 3
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int>> heap;
const int N=510,M=5010;
int h[N],e[N],ne[N],idx;
int rd[N];
int n,m;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void topsort()
{
for(int i=1;i<=n;i++)
if(!rd[i])
heap.push(i);
while(heap.size())
{
int k=heap.top();
cout<<k<<" ";
heap.pop();
for(int i=h[k];i!=-1;i=ne[i])
{
int j=e[i];
if(--rd[j]==0)
heap.push(j);
}
}
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof(h));
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b);
rd[b]++;
}
topsort();
return 0;
}