拓樸排序

有多個優先順序的排序

拓樸排序

#include<bits/stdc++.h>
using namespace std;

struct cmp{
    bool operator()(int a, int b) {
        return a > b;
    }
};

int main(){
    int n;
    cin >> n;
    vector<vector<int>> adj(n+1);
    vector<int>inDegree(n+1,0);
    vector<int>result;
    priority_queue<int, vector<int>, cmp> pq;
    for(int i=1;i<=n;++i){
        int m;
        cin >> m;
        for(int j=0;j<m;++j){
            int x;
            cin >> x;
            adj[x].push_back(i);
            inDegree[i]++;
        }
    }
    //------------------------------
    for(int i=1;i<=n;++i){
        if(inDegree[i]==0){
            pq.push(i);
        }
    }
    //------------------------------
    while(!pq.empty()){
        int u = pq.top();
        pq.pop();
        result.push_back(u);
        for(int v : adj[u]){
            inDegree[v]--;
            if(inDegree[v]==0){
                pq.push(v);
            }
        }
    }
    //-----------------------------
    for (int i = 0; i < result.size(); i++) {
        cout << result[i] << " ";
    }
    cout << endl;
}

Last updated

Was this helpful?