介绍
拓扑排序,整体是给出n个事件先后关系,来确定n个事件最终的先后关系
思路
很好理解
操作过程
我们可以理解成一个有向图如果x事件在y事件的前面,那x->y的有向边;
每次去除入度为0的点,为先者去掉与其他点连着的边,重复上述操作,知道所有点入度都为0
完美图解
对其排序的结果就是:2 -> 8 -> 0 -> 3 -> 7 -> 1 -> 5 -> 6 -> 9 -> 4 -> 11 -> 10 -> 12
代码模板
//拓扑排序
bool Topo_sort(){
int cnt=0;
//将入度为0的点加入优先队列
for(int i=1;i<=n;i++){
if(indegree[i]==0)s.push(i);
}
while(!s.empty()){
int u=s.top();
s.pop();
//记录
topo[cnt++]=u;
//删与删掉的点相关的边
for(int i=1;i<=n;i++){
if(map[u][i]){
if(--indegree[i]==0)s.push(i);
}
}
}
//有环
if(cnt<n)return 0;
return 1;
}