图算法(3)-图的拓扑排序
什么是拓扑排序?设想有这样一种情形:Tom早上起床穿衣服,但是穿衣服有一些限制,比如穿夹克前,必须先打好领带,穿皮带前必须先穿好裤子吧?这样,由穿衣顺序的依赖关系,可以构成一个图,图一条边就代表了一个依赖关系,end节点依赖begin节点。那么我们应该确定怎样的一个穿衣顺序,以保证所有限制都满足呢?这就是一个典型的拓扑排序问题。
拓扑排序可以在深度优先遍历的基础上很容易的实现,首先对图进行一次深度优先遍历,然后按照节点的完成时间排序即可,完成时间越晚,则越排序在前,需要提前完成。(算法正确性的具体证明请看算法导论22.4)
在前面代码的基础上,我实现的拓扑排序如下:
1 bool cmp(Node* x, Node* y) 2 { 3 return x->f > y->f; 4 } 5 6 void TopologicalSort(Graph& g, vector<string>& res) 7 { 8 DFS(g); 9 vector<Node*> s; 10 for (size_t i = 0; i < g.nodes.size(); ++i) 11 { 12 s.push_back(&g.nodes[i]); 13 } 14 sort(s.begin(), s.end(), cmp); 15 16 res.clear(); 17 for (size_t i = 0; i < s.size(); ++i) 18 { 19 res.push_back(s[i]->value); 20 } 21 }
其中排序时,调用了STL的sort函数,为了避免大量数据的复制,我自己写了一个cmp函数,对指针进行比较排序。