求带权有向图的最短路径,最常用的是迪杰斯特拉算法。算法的描述为:首先确定一个源点即起始点,从起始点到其他顶点的最短距离。采取的过程是用一个数组保存当前求得的最短路径,初始化时只有源点。然后遍历从起始点开始的边的权值找一个最小的,然后将这个顶点加入到数组中,重复这个过程,直到所有的顶点都在数组中为止。个人描述的可能不太清楚,其实感觉和prime算法很想,就是从一个点出发选择权值最小的并且可以引入一个新的节点,然后把这个节点当做源点重复上一步的操作,直到全部的顶点都已加入。
void shortestPath(){
int visited[];//用于记录该顶点是否已经在最短路径中
int arc[][];//邻接矩阵
int vex[];//顶点集合
int path[];//保存最短路径顶点
int D[];//v0到v的路径权值
for(v=0;v<vex.length;v++){
visited[v] = 0;
D[v] = arc[v0][v];
path[v] = 0;
}//初始化
D[v0] = 0;
visited[v0] = 0;
for(v=1;v<vex.length;v++){
int min;//当前已知的最短距离
for(w=0;w<vex.length;w++){
if(!visited[w] && D[w]<min){
k = w;
min = D[w];
}//if
}//for
visited[k] = 1;//标记为已加入路径
for(w=0;w<vex.length;w++){
if(visited[w] && (min+arc[k][w]<D[w])){
D[w] = min + arc[k][w];
path[w] = k;
}
}
}//for
}
可能由于自己理解的也不是太深入,希望大家能看懂。也许指出其中的问题。