例子
package DijkstraTest;
import java.util.Arrays;
public class Dijkstra {
public static void main(String[] args) {
//地杰斯特拉算法 求最短路径
char []node = {'A','B','C','D','E','F','G'};
int no = 5555;
int [][]nodeMap = {//0表示没有连接
{no,5,7,no,no,no,2},
{5,no,no,9,no,no,3},
{7,no,no,no,8,no,no},
{no,9,no,no,no,4,no},
{no,no,8,no,no,5,4},
{no,no,no,4,5,no,6},
{2,3,no,no,4,6,no},};
map map = new map(node,nodeMap);
map.showMap();
map.djst(6);
System.out.println("------------");
System.out.println(Arrays.toString(map.djs.fw));
System.out.println(Arrays.toString(map.djs.jl));
}
}
class map{
public char []dd;//顶点
public int [][]jz;//邻接矩阵图 (记录图的连接情况)
public djs djs;//创建djs对象以方便通过map调用djs类中数据
public map(char []dd,int [][]jz){
this.dd = dd;
this.jz = jz;
}
//查看邻接矩阵
public void showMap(){
if (dd.length>0){
for (int []i:jz){
System.out.println(Arrays.toString(i));
}
}
}
//地杰斯特拉
public void djst(int index){
//创建该算法需要用的类 生成对应属性
djs = new djs(dd.length,index);
//更新起点到他周围顶点的距离
update(index);
//然后获取所有已经有了到该顶点的距离但是该顶点还没有标记访问的顶点 然后更新这些顶点到他们周围顶点的距离
while (getNext() != -1){//意思为还有符合要求的顶点的时候 进行循环
int i = getNext();
djs.fw[i] = 1;
update(i);
// System.out.println("------------");
// System.out.println(dd[i]);
// System.out.println(Arrays.toString(djs.fw));
// System.out.println(Arrays.toString(djs.jl));
}
}
//获取下一个作为访问节点的节点 !这里每次获取的必须是所有里面距离最小的 否则影响结果!!
public int getNext(){
int n = -1;
int min = 5555;
for (int i=0;i<dd.length;i++){
//这一步的意思是说 如果当前节点没有被访问过 并且 jl中已经记录了到达这个节点的距离
if (!djs.getFw(i)&&djs.jl[i]<min){
n = i;
min = djs.jl[i];
}
}
return n;
}
//更新当前点到他周围节点的距离
public void update(int index){
int l = 0;
//循环 查看当前传入节点 与 其他所有节点的连接情况
for (int i=0;i<dd.length;i++){
l = djs.jl[index] + jz[index][i];//l = 起点到当前点距离 + 当前点到i的距离
// System.out.println(l+"***"+djs.jl[i]);
if (!djs.getFw(i)&&l<djs.jl[i]){//如果当前点i没有被访问过 并且l的值小于当前jl数组中储存的他的距离的值(因为是用一个大的数来代替无法连接的所以直接比较就行)
djs.jl[i] = l;
}
}
}
}
//里面存放地杰斯特拉算法需要用到的数组
class djs{
public int []fw;//用来记录当前节点是否被访问过 1代表已访问 0代表未访问
public int []jl;//用来记录起点 - 当前节点的距离
public djs(int length,int index){
fw = new int[length];
fw[index] = 1;//起点
jl = new int[length];
for (int i=0;i<jl.length;i++){
jl[i] = 5555;
}
jl[index] = 0;
// Arrays.fill(jl, 0);//设置jl内所有数据为0 0代表没有数据 但java初始化就为0 所以可省略
}
//查看当前节点是否被访问过
public boolean getFw(int index){
return fw[index] == 1;
}
}