zoukankan      html  css  js  c++  java
  • 最短路径之迪杰斯特拉算法(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;
    	}
    }
    

      

  • 相关阅读:
    二维数组的最大联通子数组
    四则运算网页终结版
    Python+Selenium进阶版(四)-封装一个自己的类-浏览器引擎类
    Python+Selenium进阶版(三)- 二次封装Selenium中几个方法
    Python+Selenium进阶版(二)- Python中类/函数/模块的简单介绍
    Python+Selenium进阶版 (一)- Python IDE工具-PyCharm的安装和使用
    Python+Selenium学习-Xpat增强梳理版
    Python+Selenium练习(三十一)- 截图并保存
    Python+Selenium练习(三十)- 获取页面元素的href属性
    Python+Selenium练习(二十九)- 获取当前页面全部图片信息
  • 原文地址:https://www.cnblogs.com/lc-java/p/7692761.html
Copyright © 2011-2022 走看看