数据结构学习(C++)之图
, d; }; template <class name, class dist> class ActivityNetwork { public: ActivityNetwork(Network<name, dist, Link<name, dist> >* G) : G(G), N(G->vNum()), outCriAct(CA) { count = new int[N]; result = new int[N]; } ~ActivityNetwork() { delete []count; delete []result; } const vector<CriAct>& outCriAct; const int* out; private: void initialize() { for (int j = 0; j < N; j++) count[j] = 0; for (int i = 0; i < N; i++) { for (iterator iter = begin(i); iter != end(i); iter++) count[iter->vID]++; } out = result; } Network<name, dist, Link<name, dist> >* G; vector<CriAct> CA; int N, *count, *result; }; 因为AOV和AOE的边都不会太多(想象一下边多的情况,那事件就都是鸡毛蒜皮了),所以储存结构直接选择了邻接表。并且为了体现邻接表的优势,需要直接操作私有数据,因此要把这个类声明为Link类和Network类的友元,另外由于这个类在后面,所以需要前视声明。具体如下: template <class name, class dist> class ActivityNetwork;
拓扑排序 这个算法很精巧,避免了对已经排好序的顶点的再次扫描,另外,殷版上用计数数组来充当栈的方法也很巧妙。算法的说明参阅相关的教科书,不再赘述。
由于public数据成员out和private数据成员result指向同一个数组,在类的外面可以通过out来得到排序结果,只是不能改变(当然,非要改变const数据也不是没有办法)。下面是测试程序,数据来自殷版:
关键路径 有了拓扑排序的结果,这个程序就比较好写了,那些所谓的“技巧”就不用了,如下的程序,很直白,算法说明请参考教科书。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |