定义:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列
可以证明,任意一个有向无环图都存在一个拓扑序列,有环的话不能构成拓扑序列
宽搜的一种
用法:求从小到大的排序时可以用,也可以求字符从大到小的排序
思路:枚举所有种类的点(每个点表示的数或者字符应该是不同的),将入度为0的点加入队列或者栈中,当栈或队列不空的时候,我们取栈顶或者队头元素,并且记录一下他里面一共加了多少个元素,遍历以这个元素为头节点的链表,每遍历一个数将他的入度--,当入度为0的时候加入栈或者队列中,最后判断一下如果加入栈中的元素数等于n(不同数的种类数),就说明有拓扑序,如果不相等就说明没有拓扑序。
下面是用加入队列的代码实现:
bool tp(){
int hh=0,tt=-1;
for(int i=1;i<=n;i++){
if(d[i]==0){
q[++tt]=i;
}
}
while(hh<=tt){
int t=q[hh++];
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
d[j]--;
if(d[j]==0)q[++tt]=j;
}
}
return tt==n-1;
}