Dijkstra算法 C++實(shí)現(xiàn)

單源最短路徑

對(duì)于圖G =(V钦铺,E)蹦骑,給定源點(diǎn) s 屬于 V 民效,單源路徑是指從 s 到圖中其他各頂點(diǎn)的最短路徑.

下圖為帶權(quán)有向圖禀酱,從 v0 到其余各個(gè)頂點(diǎn)的最短路徑如表所示炬守。


image

Dijkstra
源點(diǎn) 終點(diǎn) 最短路徑 路徑長(zhǎng)度
v0 v1 V0->v1 12
v2 v0->v2 10
v3 v0->v4->v3 50
v4 v0->v4 30
v5 v0->v4->v3->v5 60

Dijkstra算法

設(shè)圖的鄰接矩陣為 W ,Dijkstra 算法首先將圖的頂點(diǎn)集合劃分成兩個(gè)集合 S 和 V-S 。

集合 S 表示最短路徑已經(jīng)確定的頂點(diǎn)集合剂跟,其余的頂點(diǎn)則存放在另一個(gè)集合 V-S 中减途。

初始狀態(tài)時(shí),集合 S 至包括源點(diǎn)曹洽,即 S = {s} 鳍置,表示此時(shí)只有源點(diǎn)到自己的最短路徑稱為從源點(diǎn)到頂點(diǎn) v 到最短路徑,并用數(shù)組 D 來(lái)記錄當(dāng)前所找到的從源點(diǎn) s 到每個(gè)頂點(diǎn)的最短路徑長(zhǎng)度送淆,用數(shù)組 path 來(lái)記錄到達(dá)各個(gè)頂點(diǎn)的前驅(qū)頂點(diǎn)税产。

其中,如果從源點(diǎn) s 到頂點(diǎn) c 有弧 ,則以弧到權(quán)值作為 D[v] 的初始值辟拷;否則將 D[v] 的初始為無(wú)窮大撞羽,path 數(shù)組初始化為 s 。

Dijkstra 算法每次從尚未確定最短路徑長(zhǎng)度的集合 V-S 中取出一個(gè)最短特殊路徑長(zhǎng)度最小的頂點(diǎn) u 衫冻,將 u 加入集合 S 诀紊,同時(shí)更新數(shù)組 D 、path 中由 s 可達(dá)大各個(gè)頂點(diǎn)的最短特殊路徑長(zhǎng)度隅俘。

更新 D 的策略是邻奠,若加進(jìn) u 做中間頂點(diǎn),使得 vi 的最短特殊路徑長(zhǎng)度變短考赛,則修改 vi 的最短特殊路徑長(zhǎng)度及前驅(qū)頂點(diǎn)編號(hào)惕澎,即當(dāng) D[u]+W[u ,vi]<D[vi] 時(shí),令 D[vi] = D[u]+W[u,vi], path[vi] = u 颜骤。重復(fù)上述操作唧喉,一旦 S 包含了 V 中所有的頂點(diǎn), D 記錄了從源點(diǎn) s 到各個(gè)頂點(diǎn)的最短路徑長(zhǎng)度忍抽,path 記錄了相應(yīng)最短路徑的終點(diǎn)的前驅(qū)頂點(diǎn)編號(hào)八孝。

下表直觀地表示了 v0 到圖中其他頂點(diǎn)的最短路徑及最短路徑長(zhǎng)度汁咏。

頂?點(diǎn) ? {v2} {v2,v1} {v2,v1,v4} {v2,v1,v4,v3} {v2,v1,v4,v3,v5}
v1 12 12
v2 10
v3 60 60 50
v4 30 30 30
v5 100 100 100 90 60
最短路徑 v0v2 v0v1 v0v4 v0v4v3 v0v4v3v5
新頂點(diǎn) v2 v1 v4 v3 v5
路徑長(zhǎng)度 10 12 30 50 60

代碼實(shí)現(xiàn)

1.定義一個(gè)結(jié)構(gòu)體月培,用來(lái)記錄每個(gè)頂點(diǎn)的最短路徑淹冰。

struct Path{
    string route;
        Path(){
        route = "";
    }
};

2.Dijkstra 算法的實(shí)現(xiàn)

void Dijkstra(int s,int  D[]){
    int n = VerticesNum();
    path = new Path[n];
    int i,j;
    for(i = 0;i<n;i++){
        D[i] = matrix[s][i];
        path[i].route = "v"+to_string(s) + "-->" + "v" + to_string(i);
    }
    Mark[s] = VISITED;
    D[s] = 0;

    
    for(i = 0;i<n;i++){
        //找到一條最短的特殊路徑
        int min = INFINITY;
        int k = 0;
        for(j = 0;j<n;j++){
            if(Mark[j]==UNVISITED&&min>D[j]){
                min = D[j];
                k = j;
            }
        }
        Mark[k] = VISITED;
        for(Edge e = FirstEdge(k);IsEdge(e);e = NextEdge(e)){
            int endVertex = e.end;
            if(Mark[endVertex]==UNVISITED&&D[endVertex]>(D[k] + e.weight)&&e.weight!=INFINITY){
                //更新endVertex的最短特殊路徑
                D[endVertex] = D[k] + e.weight;
                path[endVertex].route = path[k].route + "-->v"+to_string(endVertex);
            }
        }
    }
    for(int i = 0;i<n;i++){
        if(D[i]!=INFINITY){
            cout<<path[i].route<<endl;
        }
        else{
            cout<<"no road"<<endl;
        }
    }    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捉撮,一起剝皮案震驚了整個(gè)濱河市蓉坎,隨后出現(xiàn)的幾起案子甚牲,更是在濱河造成了極大的恐慌彰居,老刑警劉巖要销,帶你破解...
    沈念sama閱讀 210,835評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牧抽,死亡現(xiàn)場(chǎng)離奇詭異嘉熊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)扬舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門阐肤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人讲坎,你說(shuō)我怎么就攤上這事孕惜。” “怎么了晨炕?”我有些...
    開封第一講書人閱讀 156,481評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵衫画,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我瓮栗,道長(zhǎng)碧磅,這世上最難降的妖魔是什么碘箍? 我笑而不...
    開封第一講書人閱讀 56,303評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮鲸郊,結(jié)果婚禮上丰榴,老公的妹妹穿的比我還像新娘。我一直安慰自己秆撮,他們只是感情好四濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著职辨,像睡著了一般盗蟆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舒裤,一...
    開封第一講書人閱讀 49,729評(píng)論 1 289
  • 那天喳资,我揣著相機(jī)與錄音,去河邊找鬼腾供。 笑死仆邓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伴鳖。 我是一名探鬼主播节值,決...
    沈念sama閱讀 38,877評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼榜聂!你這毒婦竟也來(lái)了搞疗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,633評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤须肆,失蹤者是張志新(化名)和其女友劉穎匿乃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豌汇,經(jīng)...
    沈念sama閱讀 44,088評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扳埂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘤礁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,563評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梅尤,死狀恐怖柜思,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巷燥,我是刑警寧澤赡盘,帶...
    沈念sama閱讀 34,251評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站缰揪,受9級(jí)特大地震影響陨享,放射性物質(zhì)發(fā)生泄漏葱淳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評(píng)論 3 312
  • 文/蒙蒙 一抛姑、第九天 我趴在偏房一處隱蔽的房頂上張望赞厕。 院中可真熱鬧,春花似錦定硝、人聲如沸皿桑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诲侮。三九已至,卻和暖如春箱蟆,著一層夾襖步出監(jiān)牢的瞬間沟绪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工空猜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绽慈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,240評(píng)論 2 360
  • 正文 我出身青樓抄肖,卻偏偏與公主長(zhǎng)得像久信,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漓摩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評(píng)論 2 348

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