【学习】拓扑排序

前言 

这个人太菜了都要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

 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 }
topsort

 

posted @ 2019-09-28 17:41  喵の耳  阅读(143)  评论(0编辑  收藏  举报