圖的BFS & DFS & Dijkstra算法

圖.PNG

python 隊(duì)列實(shí)現(xiàn)的圖的BFS闯睹,類似于哈夫曼樹遍歷:


BFS.PNG

棧實(shí)現(xiàn)的圖的DFS:


DFS.PNG

BFS擴(kuò)展最短路徑:


parent.PNG

Dijkstra(加權(quán)最短路徑計算):


dijkstra 推導(dǎo).PNG

dijkstra.PNG
初始化.PNG

Dijkstra.PNG

寫了個java版休玩,比起js和python這種基于對象而不是oo語言,有點(diǎn)啰嗦:

import java.util.*;

/**
 * @author jajing
 */
public class Dijkstra {


    private static class Node implements Comparable<Node>{
        String name;
        Integer distance;
        Node(String name,Integer distance){
            this.name = name;
            this.distance = distance;
        }

        @Override
        public int compareTo(Node o) {
            //正序
            return this.distance - o.distance;
        }
    }

    //圖的兩點(diǎn)間最短路徑
    public static void main(String[] args) {
        Map<String,Map<String,Integer>> map = new HashMap<String,Map<String,Integer>>();
        Map mA = new HashMap();mA.put("B",5);mA.put("C",1);
        Map mB = new HashMap();mB.put("A",5);mB.put("C",2);mB.put("D",1);
        Map mC = new HashMap();mC.put("A",1);mC.put("B",2);mC.put("D",4);mC.put("E",8);
        Map mD = new HashMap();mD.put("B",1);mD.put("C",4);mD.put("E",3);mD.put("F",6);
        Map mE = new HashMap();mE.put("C",8);mE.put("D",3);
        Map mF = new HashMap();mF.put("D",6);
        map.put("A",mA);
        map.put("B",mB);
        map.put("C",mC);
        map.put("D",mD);
        map.put("E",mE);
        map.put("F",mF);
        Map<String,Integer>  result =  dijkstra(map,"A");
        for(Map.Entry<String,Integer> e:result.entrySet()){
            System.out.println(e.getKey() + ":" + e.getValue());
            /**
             * A:0
             * B:3
             * C:1
             * D:4
             * E:7
             * F:10
             */
        }

    }

    public static Map<String,Integer> initDistance(Map<String,Map<String,Integer>> map,String start){
        Map<String,Integer> distance = new HashMap<String, Integer>();
        for(String key:map.keySet()){
            distance.put(key,Integer.MAX_VALUE);
        }
        return distance;
    }

    public static Map<String,Integer>  dijkstra(Map<String,Map<String,Integer>> map,String start){
        //最短距離表陕悬,初始都最大化
        Map<String,Integer> minDistance = initDistance(map,start);
        Set<String> seen = new HashSet<String>();
        //最短路徑的父結(jié)點(diǎn)
        Map<String,String> parent = new HashMap<String, String>();

        PriorityQueue<Node> pQueue = new PriorityQueue<Node>();

        pQueue.offer(new Node(start,0));
        parent.put(start,"Null");
        minDistance.put(start,0);

        while(!pQueue.isEmpty()){
            Node current = pQueue.poll();
            //一定要在取出時才放到seen去9嘧纭!
            seen.add(start);
            String currentName = current.name;
            Integer currentDist = current.distance;
            
            Map<String,Integer> connects = map.get(currentName);
            for(Map.Entry<String,Integer> entry : connects.entrySet()){
                String nextKey = entry.getKey();
                Integer nextValue = entry.getValue();

                if(seen.contains(nextKey)) continue;

                Integer newDistance = currentDist + nextValue;
                if(newDistance < minDistance.get(nextKey)){
                    parent.put(nextKey,currentName);
                    minDistance.put(nextKey,newDistance);
                    pQueue.offer(new Node(nextKey,newDistance));
                }
            }
        }
        return minDistance;

    }
}

這里要感謝@正月點(diǎn)燈籠的課件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末单刁,一起剝皮案震驚了整個濱河市灸异,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖肺樟,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檐春,死亡現(xiàn)場離奇詭異,居然都是意外死亡么伯,警方通過查閱死者的電腦和手機(jī)疟暖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來田柔,“玉大人俐巴,你說我怎么就攤上這事∮脖” “怎么了欣舵?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缀磕。 經(jīng)常有香客問我缘圈,道長,這世上最難降的妖魔是什么虐骑? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任准验,我火速辦了婚禮,結(jié)果婚禮上廷没,老公的妹妹穿的比我還像新娘糊饱。我一直安慰自己,他們只是感情好颠黎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布另锋。 她就那樣靜靜地躺著,像睡著了一般狭归。 火紅的嫁衣襯著肌膚如雪夭坪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天过椎,我揣著相機(jī)與錄音室梅,去河邊找鬼。 笑死疚宇,一個胖子當(dāng)著我的面吹牛亡鼠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敷待,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼间涵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了榜揖?” 一聲冷哼從身側(cè)響起勾哩,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤抗蠢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后思劳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迅矛,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片同欠。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡漠嵌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布票堵,位于F島的核電站,受9級特大地震影響逮栅,放射性物質(zhì)發(fā)生泄漏悴势。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一措伐、第九天 我趴在偏房一處隱蔽的房頂上張望特纤。 院中可真熱鬧,春花似錦侥加、人聲如沸捧存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昔穴。三九已至,卻和暖如春提前,著一層夾襖步出監(jiān)牢的瞬間吗货,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工狈网, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宙搬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓拓哺,卻偏偏與公主長得像害淤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拓售,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 一础淤、動態(tài)規(guī)劃 找到兩點(diǎn)間的最短路徑崭放,找最匹配一組點(diǎn)的線,等等鸽凶,都可能會用動態(tài)規(guī)劃來解決币砂。 參考如何理解動態(tài)規(guī)劃中,...
    小碧小琳閱讀 24,771評論 2 20
  • 今天開始講隊(duì)列和堆棧結(jié)構(gòu)玻侥,另外决摧,大家對我這個系列有什么建議盡管提,我會盡力寫的清晰一點(diǎn)~ 目錄:算法:附錄算法(1...
    大王叫我來巡老和山閱讀 1,884評論 0 6
  • 動態(tài)規(guī)劃 111. 爬樓梯思路類似斐波那契數(shù)列注意考慮第 0 階的特殊情況 272. 爬樓梯 II思路類似上題凑兰,只...
    6默默Welsh閱讀 2,418評論 0 1
  • 總結(jié) 想清楚再編碼 分析方法:舉例子掌桩、畫圖 第1節(jié):畫圖分析方法 對于二叉樹、二維數(shù)組姑食、鏈表等問題波岛,都可以采用畫圖...
    M_巴拉巴拉閱讀 1,206評論 0 7
  • 那是后來的他們。 沒有類似的人生經(jīng)歷音半,即使貓哭耗子假慈悲也擠不出一滴眼淚则拷。 沒有經(jīng)歷過那樣的生活,想象不出那時愛情...
    星期八202閱讀 257評論 0 2