喵呜~主人,让猫猫来给您解释这个有趣的拓扑排序算法吧!(>^ω^<) 

这个算法就像是在帮一群有严格顺序关系的小猫咪们排队形,保证每只猫猫都不会被前面的猫猫挡住哦~

想象一下,猫娘们要完成一系列任务:先吃小鱼干,再玩毛线球,最后睡午觉。这些任务之间有先后顺序,就像“玩毛线球”必须等到“吃完小鱼干”之后才能进行。拓扑排序就是帮我们找到一种合理的顺序,让所有任务都能按照依赖关系顺利完成。如果任务间存在循环依赖(比如A依赖B,B又依赖A),就像猫娘追自己的尾巴一样永远无法结束,这时猫猫就歇逼了喵~

先讲一讲入度是什么意思喵!简单理解的话就是有几个前置任务就有几个度(即指向自己的节点的数量)

首先,我们会统计每个任务有多少个“前置任务”(即入度)。比如,“睡午觉”可能依赖“玩毛线球”,那么“睡午觉”的入度就++。并且把“睡午觉”放在“玩毛线球”的邻接表中(容易查找喵)。

那些没有前置任务(入度为0)的任务,比如“吃小鱼干”,就可以立刻开始执行,它们会被加入一个队列中。

接着,我们从队列中取出一个任务(比如“吃小鱼干”)执行,然后检查它解锁了哪些后续任务。对于每个后续任务(如“玩毛线球”),我们会将其入度减1。如果某个后续任务的入度因此变为0(意味着它的所有前置条件都满足了),就把它也加入队列。

重复上述过程,直到队列为空。如果最终所有任务都被处理了,我们就得到了一个合法的顺序;如果还有任务剩余,说明存在循环依赖,就像猫猫们陷入了“先有鸡还是先有蛋”的困惑中,脑袋晕晕啦~

喵~总结一下,拓扑排序就像是一位聪明的猫猫指挥官,在有向无环图(DAG)这种没有循环依赖的任务网络中,通过不断找出并执行那些“已经准备好”(入度为0)的任务,来为所有任务制定一个合理的执行序列。如果发现任务网络中有环,它也会及时报告“喵呜~无法排序!”

希望这样的解释能让主人更容易理解呢!下面请看代码!

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

struct node
{
    int du=0;//度的数量
    vector<int> zi;//子节点的索引
};

int main() {
    int n,m;cin >> n >> m;
    vector<node> dd(n+1);//节点数组包含所有顶点

    for(int i=0;i<m;i++)
    {
        int f,z;cin >> f >> z;//前置与后置的索引
        dd[f].zi.push_back(z);//放入邻接表中
        dd[z].du++;//让后置的度++
    }

    queue<int> lie;//执行队列
    for(int i=1;i<=n;i++)
    {
        if(dd[i].du==0) lie.push(i);//插入无度的索引
    }

    vector<int> ans;

    while(!lie.empty())
    {
        int now=lie.front();//记录索引
        lie.pop();
        ans.push_back(now);

        for(int k:dd[now].zi)
        {
            dd[k].du--;
            if(dd[k].du==0) lie.push(k);
        }
    }
    if(ans.size()!=n) cout << -1;
    else 
    {
        for(int i=0;i<n;i++)
        {
            cout << ans[i];
            if(i!=n-1) cout << ' ';//可恶的卡空格!哈气!
        }
    }
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⡀⣀⣠⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⢀⣴⣾⣷⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⠛⠉⠉⠉⠉⠉⠉⠛⠻⠿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⡿⠿⠛⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣀⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⣰⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣶⣄⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣻⣿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢹⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⠁⠈⢢⡀⠀⠀⠀⢸⡇⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⡟⠒⢦⡀⠀⠀⠀
⠀⠀⣠⣤⣤⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡇⠀⠀⠀⠉⢢⣄⠀⠀⢿⠊⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⡄⠀⢷⠀⠀⠀
⠀⢰⠇⠀⣰⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⡌⣹⠗⠦⣬⣇⠀⠉⢢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀⢸⡄⠀⠀
⠀⡟⠀⣼⣯⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣆⢹⡀⠀⠀⠀⠉⠁⠀⠀⢀⣀⡁⠀⠀⠉⠳⢴⡆⠀⠀⠀⠀⠀⠀⢹⣧⠈⡇⠀⠀
⠀⡇⠀⠀⢻⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⠻⠉⠛⠂⠀⠀⠀⠀⠀⠀⠻⠿⣿⣿⣿⣶⣦⡀⠛⣇⠀⠀⠀⠀⠀⣈⣿⠀⡇⠀⠀
⢸⡇⠀⠀⢠⣿⣷⣦⣀⡸⣷⣦⣶⡂⠉⠉⠉⢁⣤⣶⡶⠀⠀⠀⣀⣀⡴⠀⠀⠀⠀⠀⠀⠈⠉⠉⠁⠀⡟⢀⣴⣟⣰⣾⣿⣏⣠⠇⠀⠀
⠈⡇⠀⠀⢸⣿⠁⠉⣿⠛⠛⠃⡇⠀⠀⢠⣶⣿⡿⠛⠁⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠼⢿⠟⠿⢿⡏⠀⠘⣿⡀⠀⠀⠀
⠀⢷⣀⣀⣿⠇⠀⠀⢿⡇⠀⢀⢱⡀⠀⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠀⠀⢸⠇⠀⠀⢹⣿⣄⠀⠀
⠀⠀⣉⣿⡏⠀⠀⠀⠀⠀⠀⢸⣇⣳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⣿⠃⠀⠀⠀⠀⠀⠀⣿⠈⢧⠀
⠀⠘⣿⣿⠁⠀⠀⠀⠀⠀⠀⠘⣿⡛⣶⠀⠀⣠⠔⠒⠛⠒⠦⡀⠀⠀⠀⠀⣠⡤⠶⠤⢤⣀⠀⠀⠀⢀⣏⡄⠀⠀⠀⠀⠀⡀⣿⡆⠈⣧
⣠⡾⠛⣿⣿⣧⠀⠀⠀⠀⢸⣿⠾⢿⡿⠀⣰⠃⠀⠀⠀⠀⠀⢹⡄⠀⠀⡼⠁⠀⠀⠀⠀⠈⠙⣦⠀⢸⣿⡇⣾⣣⡀⠀⢰⣿⣿⣿⣤⠾
⡟⠀⠀⠻⣿⡟⢷⡄⣤⡀⠈⣿⡀⣸⠇⠀⠏⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⡇⢀⡀⠀⠀⠀⠀⢀⡟⠀⠀⠋⣿⣿⣿⡇⣠⣿⠿⠛⢷⡀⠀
⠀⠀⠀⠀⣿⣇⣨⣿⣿⣿⣦⣽⣷⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠃⠀⠙⠢⠤⠤⠴⢾⠀⠀⠀⠀⢸⣷⣿⣿⠟⠁⠀⠀⠈⣧⠀
⠀⠀⠀⠀⠈⠉⠉⠁⠈⠉⠈⢉⣿⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⣿⠀
*/