拓扑排序
一个拓扑序列中,从入读为0的点开始遍历,得到的一个序列一定是从前指向后的,即有向无环图得到的序列
若存在从后指向前的序列,则一定不满足拓扑序列,也一定不是有向无环图。
步骤:
1.将所有入度为0的点加入队列中
2.宽搜队列,每次遍历下一个点时,删除该点与上一个节点的连接,同时让该点的入读–,当该点的入读为0时入队即可
3.遍历结束后查看是否所有点都进入过队列,若进入过则该图存在拓扑序列,该拓扑序列即为队列中的顺序队列。
static boolean topsort() {
int z=0;//总共有多少个点进入了队列
for(int i=1;i<=n;i++) {
if(d[i]==0) {
aq.add(i); //队列添加
res.add(i); //答案添加
z++; //个数枚举
}
}
while(!aq.isEmpty()) {
int t=aq.poll();
for(int i=h[t];i!=-1;i=ne[i]) {
int j=e[i];
if(--d[j]==0) {
aq.add(j);
res.add(j);
z++;
}
}
}
return z==n; //若z==n表示所有点都已经如果队伍!
}