有向无环图的拓扑排序(DFS实现)

版权声明:本文为博主原创文章,转载请说明出处 https://blog.csdn.net/t46414704152abc/article/details/83998406

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).

猜你喜欢

转载自blog.csdn.net/t46414704152abc/article/details/83998406