0001 template <typename Tv, typename Te> template <typename PU> //对v所属的连通分量做PFS 0002 void Graph<Tv, Te>::PFS(Rank v, PU prioUpdater) { //prioUpdater是决定算法功能的关键 0003 prio(v) = 0; status(v) = VISITED; //初始化,起点v加至PFS树中 0004 for (Rank k = 1; k < n; k++) { //逐步将n-1个顶点和n-1条边加入PFS树中 0005 for (Rank u = firstNbr(v); -1 != u; u = nextNbr(v, u)) //对v的每一个邻居u 0006 prioUpdater(this, v, u); //更新其优先级及其父亲 0007 int shortest = INT_MAX; 0008 for (Rank u = 0; u < n; u++) //从尚未加入遍历树的顶点中,选出下一个优先级 0009 if ((UNDISCOVERED == status(u)) && (shortest > prio(u))) //最高的 0010 { shortest = prio(u), v = u; } //顶点v 0011 status(v) = VISITED; type(parent(v), v) = TREE; //将v加入遍历树 0012 } //for 0013 } //PFS: 每选出一个顶点都需要O(n)时间,总体成本为O(n^2) —— 借助多叉堆可改进 0014 template <typename Tv, typename Te> template <typename PU> //从s出发对全图做PFS,s < n 0015 void Graph<Tv, Te>::pfs(Rank s, PU prioUpdater) { //优先级更新器PU,以函数对象形式定义 0016 reset(); //全图复位 0017 for (Rank v = s; v < s+n; v++) //从s起顺次检查所有顶点 0018 if (UNDISCOVERED == status(v%n)) //一旦遇到尚未发现者 0019 PFS(v%n, prioUpdater); //即从它出发启动一次PFS 0020 } //pfs: 通过定义具体的优先级更新策略prioUpdater,即可实现不同的算法功能