單源最短路徑-貪心算法

        單源最短路徑,關於這個問題的貪心算有點不好理解,分析後續補充,代碼也需要後續優化,便於理解

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;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章