在介绍最小支撑树和最短路径树之前,先对图的优先级搜索有个简单的了解,前面笔者介绍了图的广度优先搜索算法和图的深度优先搜索。这两种搜索虽然各有特点,但基本结构却几乎相同。都需要通过迭代逐一发现各顶点,将其归纳到遍历树中做相应的处理。两种算法的唯一差别在于,如何选取下一个节点的问题。对于广度优先搜索则为选取更早被发现的节点,而深度优先搜索则为最后被发现的节点。
如果将广度优先搜索或深度优先搜索选取下一个节点的策略抽象为根据优先级来选取。每一步迭代选取的节点都是当前所有邻居中优先级的一个极值(或优先级最高,或优先级最低)。因此,这种按照优先级来选取下一个节点的搜索过程就称为优先级搜索—PFS,亦称为最佳优先搜索。
按照上述的思路,抽象出PFS搜索的框架如下:
对节点添加优先级数:priority字段,默认值为Integer.MAX_VALUE。优先级数越高,优先级越低
private int priority = Integer.MAX_VALUE; //优先级数越高,优先级越低
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
PFS:
public void pfsTree(int index){
int v = index;
do{
if(allNodes[v].getStatus() == 0 ){
this.pfs(v);
}
}while(index != (v = (++v%size)));//存在孤立节点,继续一次pfs遍历
}
public void pfs(int v){
this.allNodes[v].setPriority(0);//该次pfs树中优先级最高的树
this.allNodes[v].setStatus(2); //VISITED
this.allNodes[v].setParent(-1);
while(true){
//遍历v的所有邻居,根据不同的策略,基于不同的优先级
for(int i=0;i<size;i++) {
if(getEdge(v, i)!=null) {
//如果节点i尚未被发现
if(allNodes[i].getStatus() == 0) {