• 最短路径之迪杰斯特拉算法(Java)


    1)Dijkstra算法适用于求图中两节点之间最短路径

    2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地方),其解决方法是通过比较每次循环中源节点到各个节点的权值来找出最小值即最短路径,然后再对各个权值进行修正,再循环。。。这种求最短路径的方式与图最小生成树算法之Kruskal(克鲁斯卡尔)算法有异曲同工之妙;

    3)该算法的时间复杂度度是O(N^2),N是节点的个数。

    源码:

    package com.neuedu.algorithm;//算法
    
    //最短路径之迪杰斯特拉
    public class Dijkstra {
    //初始化
    //stark--->k
    //stark--->k--->i的距离  < stark--->i的距离
    //重复23步骤
    	static int M=10000;//设置距离最大值表示此路不通
    	public static void main(String[] args) {
    		int [] [] weight= {
    				{0,34,43,58,M,76,243},
    				{342,0,M,54,M,32,4},
    				{2,4,0,M,67,8,32},
    				{6,98,34,0,M,5,55},
    				{34,45,66,77,0,423,M},
    				{2,4,340,M,67,0,32},
    				{34,45,66,77,566,M,0}
    		};
    		int start=0;
    		int [] shortPath=dijkstra(weight,start);
    		for (int i = 0; i < shortPath.length; i++) {
    			System.out.println(start+"到"+i+"的最短距离为:"+shortPath[i]);
    		}
    	}
    	private static int[] dijkstra(int[][] weight, int start) {
    		int n=weight.length;//确定有几个顶点
    		int [] shortPath=new int[n];//记录从start到每个顶点的最短路径
    		String [] path=new String[n];//记录从start到每个顶点最短路径经过的点
    		int [] visited=new int[n];//记录每个点是否已获得最短路径
    		for (int i = 0; i <n; i++) {
    			path[i]= new String(start+"--->"+i);
    		}
    		shortPath[start]=0;
    		visited[start]=1;
    		for (int count = 1; count < n; count++) {
    			int k=-1;//找出最短路径的点
    			int dmin=Integer.MAX_VALUE;//记录最短路径
    			for (int i = 0; i <n; i++) {
    				if (visited[i]!=1&&weight[start][i]<dmin) {
    					k=i;
    					dmin=weight[start][i];
    				}
    			}
    			System.out.println("k="+k);
    			shortPath[k]=dmin;
    			visited[k]=1;
    			for (int i = 0; i <n; i++) {
    				if (visited[i]!=1&&weight[start][k]+weight[k][i]<weight[start][i]) {
    					path[i]=path[k]+"--->"+i;
    					weight[start][i]=weight[start][k]+weight[k][i];
    				}
    			}
    		}
    		for (int i = 0; i < n; i++) {
    			System.out.println(start+"到"+i+"的最短路径为:"+path[i]);
    		}
    		return shortPath;
    	}
    }
    

      

  • 相关阅读:
    关于并发量的简单计算公式
    kbmmw中向服务器端传递对象的一种简单方式
    tms web core 里面调用pascal 过程。
    tms web core 通过URL 传递参数
    tms web core 与 kbmmw 第一次亲密接触
    kbmmw 的HTTPSmartService 上传文件到服务器端
    kbmmw 中的进程管理小工具
    kbmmw 5.06.20 发布
    kbmmw ORM 对象定义语法简析
    kbmmw 5.06.00 beta 发布
  • 原文地址:https://www.cnblogs.com/lc-java/p/7692761.html
Copyright © 2020-2023  润新知