拓扑板子

#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> to[10001];
int input_cnt[10001];
int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n;i++){
        int tmp;
        while(1){
            scanf("%d", &tmp);
            if(tmp==0)
                break;
            int u = i;
            int v = tmp;
            input_cnt[v]++;
            to[u].push_back(v);
        }
    }
    queue<int> que;
    for (int i = 1;i<=n;i++){
        if(input_cnt[i]==0)
            que.push(i);
    }//假如某个点没有前辈就放进队列等待处理
    while(!que.empty()){
        int u = que.front();
        que.pop();
        printf("%d ", u);
        for(int v:to[u]){
            input_cnt[v]--;
            if(input_cnt[v]==0)
                que.push(v);
        }
    }
}

点赞

发表回复