1.有向无环图的拓扑排序
// enDegree表示每个顶点的入度,这个数据结构可以从图的结构求出来
// graph是一个二维数组,但是这个数组不是图的邻接矩阵,graph[i][j]表示依赖于i的第j个元素的编号
// 在本文中,i依赖于j表达的意思是,拓扑排序中必须先输出j,然后才能输出i
int topSort(vector<vector<int>>& relayVec, vector<int>& enDegree) {
queue<int> myQueue;
for (int i = 0; i < enDegree.size(); ++i) {
if (enDegree[i] == 0){
myQueue.push(i);
}
}
while(!myQueue.empty()){
int top = myQueue.front();
for(int i = 0;i<relayVec[top].size();++i){ // 所有依赖于编号为top的元素的入度减小1,如果减小后刚好为0,入队
if(--enDegree(relayVec[top][i])==0)
myQueue.push(relayVec[top][i]);
}
}
2. 算法复杂度分析
上述拓扑排序中,第一次将入度为0的顶点添加到队列中,复杂度为O(n), 随后从循环中每弹出一个节点,就会寻找将依赖该节点的节点的入度减小1次,依赖关系被访问一次,即访问一条边,整个流程下来,每个顶点及其相邻的边都仅仅被访问1次,因此整体时间复杂度为O(m+n).