【学习】拓扑排序
前言
这个人太菜了都要CSP了才学拓扑排序
0x10 定义
给定一张有向无环图,若一个由图中所有点构成的序列A满足边(x,y),x在A中都出现在y之前,则称A是该有向无环图顶点的一个拓扑序。求解A的过程就叫做拓扑排序。
——蓝书·lyd
0x20 思想+过程
选择入度为0的点,然后把他连向的点入读减1就行了
过程:
1.建立空的序列A
2.预处理所有点的入度,把入度为0的点入队
3.取队头x,把x放在A的末尾
4.遍历从x连出的y点,并把y的入度减1,如果这是y的入度为0,入队
5.循环3,4直至队列为空,得到A序列
0x30 用处+题目
①判环
②处理图上有明显先后顺序要求的题目
Luogu P1038 神经网络
Luogu P2661 信息传递
0x40 code
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void topsort(){ 2 queue<int>q; 3 int x,v; 4 for(int i=1;i<=n;i++){ 5 if(!r[i])q.push(i);//如果入度为零,入队 6 } 7 while(!q.empty()){ 8 x=q.front();q.pop(); 9 a[++tot]=x; 10 for(int i=head[x];i;i=e[i].nxt){ 11 v=e[i].to;--r[v]; 12 if(!r[v])q.push(v); 13 } 14 } 15 }