介紹
- 學習記錄
給所有頂點賦予不同的優先級數, 隨着算法的推進不斷調整, 每一步迭代選取的頂點都是當時優先級數最低的那個。
負責調整優先級的部分以函數對象形式實現
實現源碼
// 優先級搜索算法
template <typename PU> void pfs(int v, PU prioUpdater){
// 重置圖狀態
reset();
// 時間標籤
int clock = 0;
int s = v;
// 遍歷所有頂點
do {
// 所有未發現的頂點執行優先級搜索算法
if (status(v) == UNDISCOVERED) {
PFS(v, prioUpdater);
}
// 迭代到下一頂點
v = ++v%n;
} while (s != v);
}
// 連通域 優先級搜索框架
template <typename PU> void PFS(int v, PU prioUpdater) {
// 更新頂點優先級,狀態
priority(v) = 0; // 最高優先級
status(v) = VISITED;
// 起點s加入遍歷樹中
parent(s) = -1;
// 遍歷所有頂點
while(true) {
// 更新當前頂點的鄰接頂點的優先級數和父級頂點
for (int w = firstNbr(s); w > -1 ; w = nextNbr(s, w)) {
prioUpdater(this,s, w);
}
// 獲取尚未加入遍歷樹中的所有頂點中優先級數最小的頂點
int shortest = INT_MAX;
for (int w =0; w < n ; w++) {
if (status(w) == UNDISCOVERED && priority(w) < shortest) {
shortest = priority(w);
s = w;
}
}
// TODO 自定義一些事情
// 所有頂點都已經遍歷過了
if (status(s) == VISITED) {
break;
}
// 更新當前頂點的狀態
status(s) = VISITED;
type(parent(s), s) = TREE;
}
}