zoukankan      html  css  js  c++  java
  • Dijkstra 算法

    package dijkstra;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    public class Dijkstra {
    
    	public static int U = 99999999; // 此路不通
    
    	static class Path2Len {
    		public List<Integer> shortPath;
    		public int shortLen;
    
    		public Path2Len(int start) {
    			this.shortPath = new ArrayList<Integer>();
    			this.shortPath.add(start);
    			this.shortLen = U;
    		}
    	}
    
    	public static void main(String[] args) {
    
    		int[][] graph = { { 0, 10, U, 30, 100 }, { U, 0, 50, U, U },
    				{ U, U, 0, U, 10 }, { U, U, 20, 0, 60 }, { U, U, U, U, 0 } };
    
    		int start = 0;
    		Path2Len[] path2Len = dijkstra(graph, start);
    		for (int i = 0; i < path2Len.length; i++) {
    			System.out.println("从" + start + "出发到" + i + "的最短长度为:"
    					+ path2Len[i].shortLen + ", 具体路径:" + path2Len[i].shortPath);
    		}
    
    	}
    
    	public static Path2Len[] dijkstra(int[][] graph, int start) {
    
    		int vertexCount = graph.length; // 顶点数
    
    		// 一维数组path2LenArray,保存出发点到其余点的距离和路径
    		Path2Len[] path2LenArray = new Path2Len[vertexCount];
    
    		// 保存未访问的点
    		Set<Integer> unVistedVetrixSet = new HashSet<Integer>();
    
    		// 初始化path2LenArray,用连接矩阵初始化
    		for (int i = 0; i < vertexCount; i++) {
    			Path2Len path2Len = new Path2Len(start);
    			path2Len.shortLen = graph[start][i];
    			path2LenArray[i] = path2Len;
    			unVistedVetrixSet.add(i);
    		}
    
    		// 出发点已经访问
    		unVistedVetrixSet.remove(start);
    
    		// 查询 N-1 次
    		while (!unVistedVetrixSet.isEmpty()) {
    
    			// 先从path2LenArray 查询一个未访问的最近点
    			int minIndex = -1;
    			int minLen = U;
    			for (int column = 0; column < path2LenArray.length; column++) {
    				if (unVistedVetrixSet.contains(column)) {
    					if (path2LenArray[column].shortLen < minLen) {
    						minLen = path2LenArray[column].shortLen;
    						minIndex = column;
    					}
    				}
    			}
    			
    			if (minLen >= U) {
    				break;
    			}
    			
    			// 查找到最近点minIndex,设置为已经访问
    			unVistedVetrixSet.remove(minIndex);
    			System.out.println("minIndex = " + minIndex + " found ");
    
    			// 根据查找到的minIndex 和连接矩阵,更新path2LenArray
    			for (int column = 0; column < path2LenArray.length; column++) {
    				if (unVistedVetrixSet.contains(column)) {
    					int old_start_2_column = path2LenArray[column].shortLen;
    					int new_start_2_column = path2LenArray[minIndex].shortLen
    							+ graph[minIndex][column];
    					if (new_start_2_column < old_start_2_column) {
    						path2LenArray[column].shortLen = new_start_2_column;
    						path2LenArray[column].shortPath.clear();
    						path2LenArray[column].shortPath
    								.addAll(path2LenArray[minIndex].shortPath);
    						path2LenArray[column].shortPath.add(column);
    					}
    				}
    			}
    		}
    		return path2LenArray;
    	}
    
    }
    
    
    


    可以看出,Dijstra算法的时间复杂度为N^2


  • 相关阅读:
    Centos Another app is currently holding the yum lock
    Centos 重置密码
    Effective c#学习笔记(1)
    浅谈计算机编码
    mongodb java spring data
    VS2013 好用的插件
    xml存储bug
    VS 2008 生成操作中各个选项的差别
    程序权限控制
    给钛度产品的一些建议(Note)
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276123.html
Copyright © 2011-2022 走看看