有向图的最短路径算法----使用Dijkstra算法
此示例中是基于邻接矩阵的实现
要求输入:每个节点到其他节点的直接距离
要求输出:源点到其他节点 的最短距离
public int[] dijkstra(int[][] weight) {
//源点到每个点的距离
int[] dis = weight[0];
//存储点的状态,是否已经访问
boolean[] sta = new boolean[weight[0].length];
//设置为真表示源点已经访问
sta[0] = true;
//根据现实情况把用户输入的值中的-1(表示不能直接到达)换成最大值
//可根据具体要求进行部分改动
for(int i=0; i<weight.length; i++) {
for(int j=0; j<weight[0].length; j++) {
if(weight[i][j] == -1)
weight[i][j] = Integer.MAX_VALUE;
}
}
//从第二个点开始访问
for(int i=1; i<weight[0].length; i++) {
int min = Integer.MAX_VALUE;
//存储没有访问的距离最小值的下标
int index = -1;
//获取下标和最小值
for(int j=1; j<weight[0].length; j++) {
if(sta[j] == false) {
if(dis[j] < min) {
index = j;
min = dis[j];
}
}
}
if(index != -1) { //找到最小的,状态标记为true,已访问
sta[index] = true;
}else { //
continue;
}
//找到的最短路径节点的可使用边中,判断是否比比已经存在的最短路径短,是则进行替换
for(int l=1; l<weight[0].length; l++) {
if(sta[l] == false) { //查看未被访问的节点a
//判断当前节点到节点a的最短距离,如果当前节点可直接到达节点a(设距离为dist),
//并且min+dist1小于源点到节点a的距离dis,则替换dis为dist
if(weight[index][l] != Integer.MAX_VALUE
&& (min + weight[index][l] < dis[l])) {
dis[l] = min + weight[index][l];
}
//否则,啥也不干
}
}
}
return dis;
}
}
测试有向图:
数据表示:
输出结果: