0001 template <typename Tv, typename Te> template <typename PU> //优先级搜索(全图) 0002 void Graph<Tv, Te>::pfs( Rank s, PU prioUpdater ) { // s < n 0003 reset(); //全图复位 0004 for ( Rank v = s; v < s + n; v++ ) //从s起顺次检查所有顶点 0005 if ( UNDISCOVERED == status( v % n ) ) //一旦遇到尚未发现者 0006 PFS( v % n, prioUpdater ); //即从它出发启动一次PFS 0007 } //如此可完整覆盖全图,且总体复杂度依然保持为O(n+e) 0008 0009 template <typename Tv, typename Te> template <typename PU> //顶点类型、边类型、优先级更新器 0010 void Graph<Tv, Te>::PFS( Rank v, PU prioUpdater ) { //优先级搜索(单个连通域) 0011 priority( v ) = 0; status( v ) = VISITED; //初始化,起点v加至PFS树中 0012 for ( Rank k = 1 ; k < n ; k++ ) { //逐步将n-1顶点和n-1条边加至PFS树中 0013 for ( Rank u = firstNbr( v ); - 1 != u; u = nextNbr( v, u ) ) //对v的每一个邻居u 0014 prioUpdater( this, v, u ); //更新其优先级及其父亲 0015 int shortest = INT_MAX; 0016 for ( Rank u = 0; u < n; u++ ) //从尚未加入遍历树的顶点中,选出下一个优先级 0017 if ( ( UNDISCOVERED == status( u ) ) && ( shortest > priority( u ) ) ) //最高的 0018 { shortest = priority( u ), v = u; } //顶点v 0019 status( v ) = VISITED; type( parent( v ), v ) = TREE; //将v加入遍历树 0020 } //for 0021 } //通过定义具体的优先级更新策略prioUpdater,即可实现不同的算法功能