拓扑排序(优先队列)queue、C++

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
#include
#include
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;
}

你可能感兴趣的:(c++,算法,数据结构)