拓扑排序首先针对的是有向无环图,其主要的目的是将一个有向图变为一个线性序列,就像任务排序那样的感觉。对于任何任务,必然先要完成其先导任务,对于同等级的任务,就可以随意进行排序处理,当是一个正常可完成的无环图,必然可以使得生成一个同节点个数的线性序列;
对于拓扑排序,核心的步骤要借助队列进行;
首先,根据我们的观察,一个可以进行拓扑排序的图必然存在入度为0的点,这也是我们必须要先进行处理的点。第一步就是将这些入度为0的点打进队列;
将队列中的点进行处理,处理一个出队一个,当我们完成一个点的时候,有可能后继的节点也可以进行处理,所以这里处理完一个节点,就将后继的节点进行入度-1,当有一个后继节点入度变为0,就说明可以进行处理,加入队列;
重复的进行上述操作,直至队列内为空。
大致代码如下,不难理解:
其中值得注意的是我们维护了一个inDegree队列,来进行每个节点入度的值,作为判断是否入队列的条件;
vector<int>G[MAXV];
int n,m,inDegree[MAXV];
bool topologicalSort(){
int num=0;
queue<int>q;
for(int i=0;i<n;i++){
if(inDegree[i]==0){
q.push(i);
}
}
while(!.empty()){
int u=q.front();
q.pop();
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
inDegree[v]--;
if(inDegree[v]==0){
q.push();
}
}
G[u].clear();
num++;
}
if(num==n)
return true;
else
return false;
}