图算法:拓扑排序 详解~

以下所有问题都是基于:有向图 无环图

为什么?

看完你可能就知道为啥了。

首先解释:为什么有拓扑排序?什么是拓扑排序?

假如你是一个编译器,你需要编译以下命令。

A B C D E 这几条命令。

A是依赖B C 的, C依赖 D E , B 依赖E ,这时候你需要找到一条不需要依赖其他命令的那条命令首先编译他,之后的才能编译。

所以我们可以画一个有向图表示这样的关系,


用指向的剪头表示,依赖关系。

这时候我们用拓扑排序就可以找到依赖关系最小的那个顶点在这个图里就是D E。依次排序输出。


拓扑排序的思路是什么呢?


找到入度为0的点,然后把他储存后在图里删掉。

那么这个点的nexts里面的点入度就减少1

继续找入度为0的点重复上述步骤。


算法的设计:

用一个map保存他的所有节点对应的入度。

用一个队列保存每次入度为0的节点然后pop,pop的顺序就是拓扑排序的顺序。



list <node*> tsort(graph G) {
	list<node*> res;
	unordered_map<node*, int> inmap; 
	queue<node*> zeronode;
	for (auto next : G.nodes) {//G.nodes是map
		inmap[next.second] = next.second->in;
		if (next.second->in == 0) {
			zeronode.push(next.second);
		}
	}
	while (!zeronode.empty()) {
		node* cur = zeronode.front();
		zeronode.pop();
		res.push_back(cur);
		for (auto next : cur->nexts) {
			inmap[next]--;
			if (inmap[next] == 0) {
				zeronode.push(next);
			}
		}
	}

	return res;
 }

发布于 2020-04-08 17:25