單源最短路徑,關於這個問題的貪心算有點很差理解,分析後續補充,代碼也須要後續優化,便於理解java
package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by saishangmingzhu on 2018/12/3. * 單源最短路徑 */ public class SingleSourceShortestPath { public static void main(String[] arg) { new SingleSourceShortestPath().greedy(); } /** * 貪心算法 */ public void greedy(){ //【1】建立有向圖 List<Point> pointList=new ArrayList<>(); pointList.add(new Point("A",0)); pointList.add(new Point("B",1)); pointList.add(new Point("C",2)); pointList.add(new Point("D",3)); pointList.add(new Point("E",4)); Map<String,Integer> pathMap=new HashMap<>(); pathMap.put("AB",10); pathMap.put("AD",30); pathMap.put("AE",100); pathMap.put("BC",50); pathMap.put("CE",10); pathMap.put("DC",20); pathMap.put("DE",60); //【2】從源頂點計算距離 // 源頂點爲A int[] dist=new int[pointList.size()]; for (int i=1;i<dist.length;i++){ dist[i]=Integer.MAX_VALUE; } List<Point> resultList=new ArrayList<>(); Point first=pointList.get(0); pointList.remove(0); while (pointList.size()>0){ int min=10000; Point minP=null; for (int i=0;i<pointList.size();i++) { Point p = pointList.get(i); String key = first.getName() + p.getName(); if (pathMap.containsKey(key)) { int v = pathMap.get(key); if (dist[p.getIndex()] > v + dist[first.getIndex()]) { dist[p.getIndex()] = v + dist[first.getIndex()]; if (min>v + dist[first.getIndex()]){ min=v + dist[first.getIndex()]; minP=p; } } } else { if (min>dist[p.getIndex()]){ min=dist[p.getIndex()]; minP=p; } } } resultList.add(minP); pointList.remove(minP); first=minP; } for (int i:dist) System.out.println(i); } } class Point{ String name; int index; public Point(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }