文章标题

迪杰斯特拉算法求最短路径问题(java实现)

算法思想:先定义一个二维数组将每个顶点到其余直接相连顶点的距离保存起来,若没有直接相连,则用Integer.MAX_VALUE(int类型的最大值)代替,再定义两个一位数组distance[],previous[],distance用来保存某个顶点到其余顶点的最短距离,previous则保存其余顶点的前驱顶点的下标,通过主次比较筛选出最短路径。
代码实现:
public class ShortestPath {
private static int max = Integer.MAX_VALUE;
private static int[] dist = new int[6];
private static int[] prev = new int[6];
private static int a[][]={
{0,max,10,max,30,100},
{max,0,5,max,max,max},
{max,max,0,50,max,max},
{max,max,max,0,max,10},
{max,max,max,20,0,60},
{max,max,max,max,max,0}
};
public static void main(String[] args) {

    // TODO Auto-generated method stub
    ShortestPath shortestPath = new ShortestPath();
    shortestPath.dijkstra(0, a, dist, prev);
    System.out.print("顶点0到其余顶点的最短路径是:");
    for(int i = 0;i < dist.length;i++){
        System.out.print(dist[i]+" ");
    }
    //System.out.println("hehe");
}
/**
 * 迪杰斯特拉算法
 */
public void dijkstra(int v,int[][] a,int[] dist,int[] prev){
    int n = dist.length - 1;
    boolean[] s = new boolean[n+1];//判断该顶点是否找到了最短路径
    for(int i = 1;i <= n;i++){
        //初始化dist数组
        dist[i] = a[v][i];
        s[i] = false;
        if(dist[i] < max){
            prev[i] = v;
        }else{
            prev[i] = -1;
        }
    }
    dist[v] = 0;
    s[v] = true;
    for(int i = 1;i <= n;i++){
        int temp = Integer.MAX_VALUE;//temp暂存v到其余定点的最短距离
        int u = v;
        for(int j = 1;j <= n;j++){
            if((!s[j]) && dist[j] < temp){//如果该顶点不属于s顶点集并且该顶点有前驱顶点
                u = j;//更新当前源顶点,将
                temp = dist[j];//更新当前最短路径
            }
        }
        s[u] = true;
        for(int j = 0;j <= n;j++){
            if((!s[j]) &&a[u][j] < max){
                int newDist = dist[u] + a[u][j];
                if(newDist < dist[j]){
                    dist[j] = newDist;
                    prev[j] = u;                    
                    }
            }
        }
    }   
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值