thoughs:
算法:BestFS(G, s)
输入:有向图G及其中的顶点s
输出:从s出发,对G做最佳优先遍历,并对访问到的边进行分类
假设:调用之前,所有顶点的状态都已置为UNDISCOVERED,所有边的分类置为UNKNOWN
{
若s已被访问(status[s] != UNDISCOVERED),则直接返回;
令Distance(s) = 0; //最近 = 最佳
不断地 {
在所有尚未访问过的顶点中,找出距离已访问点集最近的顶点v;
调用visit(v),对v进行访问,并将其加入已访问点集(将其状态设置为status[v] = VISITED);
调用updateDistanceAfter(v),更新各顶点到已访问点集的最短距离;
} 直到所有顶点都已被访问
}
code:
public class BestFS {
public BestFS(Graph gg) {
super(g);
}
//最佳的优先遍历的算法
public Object traver(Vertex s,Object info){
// 针对的非连通图
if(UNDISCOVERED!=S.getstatus()){
return null;
s.setDistance(0);
Vertex v;
while (null!=(v=bestVertex())){
visit(v,null);
updateDistanceAfter(v);
}
return null;
}
//定点访问操作: 在被算法中,info 无用
protect Object visit(Vertex v,Object info){
v.setState(VISITED);
}
//基于bestFS d最短的距离算法: s为期待能够hi是定点,info 想算法传递参数
public Object algorithm(Vertex s,Obejct info{
reset(s); //初始化
traver(s,info);
return null;
}
//从尚未访问到的定点中悬案出最佳的者
protected Vertex bestVertex(){
int bestvalue=Integer.MAX_VALUE;
Vertex bestVertex=null;
for (Iterator it=G.vertices();it.hasnext():
) {
Vertex u=(Vertex) it.getNext();
if(UNDISCOVERED==u.getStaus()){
if(UNDISCOVERED==U.getStatus()){
bestvalue=u.getDistance();
bestVertex=u;
}
}
}
if(null!=bestVertex && (null!=bestVertex.getBSParent())){
G.edgeFromTo(bestVertex.getBFSParent(), bestVertex).setType(TREE);//被标记为
return bestVertex;
}
}
}
}
证明: