拓扑排序模板,适合n,m不是很大的时候使用

有需要可以自取

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

int in[1005], out[1005]; //入度,出度
int n, m, d;
vector<vector<int>> g(1005);
vector<int> topsort; //最终的拓扑序

void del(int u); //删点
void solve(); //主要操作函数(解决问题的)

int main() {
    memset(in, 0, sizeof in); 
    memset(out, 0, sizeof out); 
    //初始化
    cin >> n >> m;
    d = n;

    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v); //有向图建边
        out[u]++; //出度++
        in[v]++; //另外一个被指向的点,入度++
    }
    solve();  //进入操作函数
    for(auto it:topsort)
	{
		cout<<it<<' ';
    } //输出答案(字典序最小,数字情况下)
}

void solve() {
    while (d > 0) {  //还有可以删除的节点
        int f = 0;
        for (int i = 1; i <= n; i++) {
            if (in[i] == 0) {
                del(i); //删除这个点
                f = 1; // 发现可删除的节点
            }
        }
        if (!f and d>0) { //没有可删除的节点,且还有节点未被删除
            cout << "-1";
            exit(0);
        }
    }
}

void del(int u) { //删点函数
    in[u] = -1; // 标记为已删除
    out[u] = 0; // 清空出度
    topsort.push_back(u);
    d--; // 更新剩余未删除节点的数量
    for (auto it : g[u]) {
        in[it]--;
    } //将它指向的每一个点的入度--
}