图算法(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函数,对指针进行比较排序。

posted @ 2014-01-07 15:04  Tiancai Ye  阅读(278)  评论(0)    收藏  举报