新发现或大错误!!高手看看,starfish别漏了。
因为好多聪明多的人都推荐Dij,floyd算法,而我又不聪明,所以我的一定有错。
已知:用十字链表存储的有向网络,弧的权值存在ArcBox里。
求解:从给定原点(eg. v0)到其余顶点的最短路径。
解:用Broadth_first_search,
by way of
队列queue
辅助数组
int _priorVex[MAX_VERTEX_NUM+1]; 纪录当前最短路径本节点的立即前驱节点的下标
int _shortPath[MAX_VERTEX_NUM+1]; 记录本节点的当前最短路径的权值
算法:假设所定原点是v0
enqueue(v0);
while(queue not empty){
p=dequeue();
for(q=p.firstout;q;q=p.nextout(q)){
if(_shortPath(p)+weight(p,q) < _shortPath(q)){
_shortPath(q) := _shortPath(p)+weight(p,q);
_priorVex(q)=p;
if(q is not in queue){
enqueue(q);
}
}
}
}
我的考虑是:
假设v0...v1...v2是v0到v2的最短路径,那么可以断言
此中的v0...v1是v0到v1的最短路径(反证法)
而此路径中的任意一点都对应一条弧,弧又对应于<tail,head>。
对应于顶点v,若它的_shortPath改变了(定由于某条进入它的弧引起的变化),那么以v为弧尾的弧的弧头都应看看有没有变化,所以
if(q is not in queue){
enqueue(q);
}
我还有源代码,谁有兴趣请留下mail,谢谢。