最短路徑Dijkstra算法和Floyd算法整理、

轉載自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

?

最短路徑—Dijkstra算法和Floyd算法

Dijkstra算法

1.定義概覽

Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra算法是很有代表性的最短路徑算法,在很多專業課程中都作為基本內容有詳細的介紹,如數據結構,圖論,運籌學等等。注意該算法要求圖中不存在負權邊。

問題描述:在無向圖 G=(V,E) 中,假設每條邊 E[i] 的長度為 w[i],找到由頂點 V0 到其余各點的最短路徑。(單源最短路徑)

?

2.算法描述

1)算法思想:設G=(V,E)是一個帶權有向圖,把圖中頂點集合V分成兩組,第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以后每求得一條最短路徑 , 就將加入到集合S中,直到全部頂點都加入到S中,算法就結束了),第二組為其余未確定最短路徑的頂點集合(用U表示),按最短路徑長度的遞增次序依次把第二組的頂點加入S中。在加入的過程中,總保持從源點v到S中各頂點的最短路徑長度不大于從源點v到U中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點為中間頂點的當前最短路徑長度。

2)算法步驟:

a.初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其余頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值為∞。

b.從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。

c.以k為新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改后的距離值的頂點k的距離加上邊上的權。

d.重復步驟b和c直到所有頂點都包含在S中。

?

執行動畫過程如下圖

?

3.算法代碼實現:

?

復制代碼
const int  MAXINT = 32767;
const int MAXNUM = 10;
int dist[MAXNUM];
int prev[MAXNUM];int A[MAXUNM][MAXNUM];void Dijkstra(int v0)
{bool S[MAXNUM];                                  // 判斷是否已存入該點到S集合中int n=MAXNUM;for(int i=1; i<=n; ++i){dist[i] = A[v0][i];S[i] = false;                                // 初始都未用過該點if(dist[i] == MAXINT)    prev[i] = -1;else prev[i] = v0;}dist[v0] = 0;S[v0] = true;   for(int i=2; i<=n; i++){int mindist = MAXINT;int u = v0;                               // 找出當前未使用的點j的dist[j]最小值for(int j=1; j<=n; ++j)if((!S[j]) && dist[j]<mindist){u = j;                             // u保存當前鄰接點中距離最小的點的號碼 mindist = dist[j];}S[u] = true; for(int j=1; j<=n; j++)if((!S[j]) && A[u][j]<MAXINT){if(dist[u] + A[u][j] < dist[j])     //在通過新加入的u點路徑找到離v0點更短的路徑  {dist[j] = dist[u] + A[u][j];    //更新dist prev[j] = u;                    //記錄前驅頂點 }}}
}
復制代碼

?

4.算法實例

先給出一個無向圖

用Dijkstra算法找出以A為起點的單源最短路徑步驟如下

?

Floyd算法

1.定義概覽

Floyd-Warshall算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用于計算有向圖的傳遞閉包。Floyd-Warshall算法的時間復雜度為O(N3),空間復雜度為O(N2)。

?

2.算法描述

1)算法思想原理:

???? Floyd算法是一個經典的動態規劃算法。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做一個詮釋(這個詮釋正是動態規劃最富創造力的精華所在)

????? 從任意節點i到任意節點j的最短路徑不外乎2種可能,1是直接從i到j,2是從i經過若干個節點k到j。所以,我們假設Dis(i,j)為節點u到節點v的最短路徑的距離,對于每一個節點k,我們檢查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,證明從i到k再到j的路徑比i直接到j的路徑短,我們便設置Dis(i,j) = Dis(i,k) + Dis(k,j),這樣一來,當我們遍歷完所有節點k,Dis(i,j)中記錄的便是i到j的最短路徑的距離。

2).算法描述:

a.從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。   

b.對于每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。

3).Floyd算法過程矩陣的計算----十字交叉法

方法:兩條線,從左上角開始計算一直到右下角 如下所示

給出矩陣,其中矩陣A是鄰接矩陣,而矩陣Path記錄u,v兩點之間最短路徑所必須經過的點

相應計算方法如下:

最后A3即為所求結果

?

3.算法代碼實現

復制代碼
typedef struct          
{        char vertex[VertexNum];                                //頂點表         int edges[VertexNum][VertexNum];                       //鄰接矩陣,可看做邊表         int n,e;                                               //圖中當前的頂點數和邊數         
}MGraph; 

void Floyd(MGraph g) {int A[MAXV][MAXV];int path[MAXV][MAXV];int i,j,k,n=g.n;for(i=0;i<n;i++)for(j=0;j<n;j++){   A[i][j]=g.edges[i][j];path[i][j]=-1;}for(k=0;k<n;k++){ for(i=0;i<n;i++)for(j=0;j<n;j++)if(A[i][j]>(A[i][k]+A[k][j])){
  A[i][j]=A[i][k]+A[k][j];path[i][j]=k;} }
}
復制代碼

算法時間復雜度:O(n3)

轉載于:https://www.cnblogs.com/sasuke-/p/5225832.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375041.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java Script 中 ==(Equal) 和 === (Identity Equal) 的區別和比較算法邏輯

判斷兩個變量是否相等在任何編程語言中都是非常重要的功能。 JavaScript 提供了 和 兩種判斷兩個變量是否相等的運算符&#xff0c;但我們開始學習的時候 JavaScript 的時候&#xff0c;就被一遍又一遍的告知&#xff1a; 要求變量的類型和值均相等&#xff0c;才能返回true…

靶場練習第十五天~vulnhub靶場之dc-7

一、準備工作 kali和靶機都選擇NAT模式&#xff08;kali與靶機同網段&#xff09; 1.靶場環境 下載鏈接:https://download.vulnhub.com/dc/DC-7.zip 2.kali的ip 命令:ifconfig 3.靶機的ip 掃描靶機ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&…

ubuntu系統下如何修改host

Ubuntu系統的Hosts只需修改/etc/hosts文件&#xff0c;在目錄中還有一個hosts.conf文件&#xff0c;剛開始還以為只需要修改這個就可以了&#xff0c;結果發現是需要修改hosts。修改完之后要重啟網絡。具體過程如下&#xff1a;1、修改hostssudo gedit /etc/hosts2、添加解析記…

Matplotlib不顯示圖形

安裝好了Matplotlib&#xff0c;使用官方一個例子測試運行時&#xff0c;發現使用畫圖功能時&#xff0c;運行腳本老是顯示不出圖像&#xff0c;Google了一下&#xff0c;后來發現是matplotlibrc文件沒配置好。 參考了官方文檔&#xff0c;修改步驟如下 1.查找matplotlibrc文件…

靶場練習第十六天~vulnhub靶場之dc-8

一、準備工作 kali和靶機都選擇NAT模式&#xff08;kali與靶機同網段&#xff09; 1.靶場環境 下載鏈接:https://download.vulnhub.com/dc/DC-8.zip 2.kali的ip 命令:ifconfig 3.靶機的ip 掃描靶機ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&…

【SpringMVC】SpringMVC系列4之@RequestParam 映射請求參數值

4、RequestParam 映射請求參數值 4.1、概述 Spring MVC 通過分析處理方法的簽名&#xff0c;將 HTTP 請求信息綁定到處理方法的相應人參中。Spring MVC 對控制器處理方法簽名的限制是很寬松的&#xff0c;幾乎可以按喜歡的任何方式對方法進行簽名。必要時可以對方法及方法入…

Sprint3

進展&#xff1a;今天主要是各自熟悉安卓應用開發平臺&#xff0c;設計了圖標&#xff0c;沒什么實際上的進展。 燃盡圖&#xff1a; 團隊工作照&#xff1a; 轉載于:https://www.cnblogs.com/XJXYJ/p/4495810.html

靶場練習第十七天~vulnhub靶場之dc-9

一、準備工作 kali和靶機都選擇NAT模式&#xff08;kali與靶機同網段&#xff09; 1.靶場環境 下載鏈接:https://download.vulnhub.com/dc/DC-9.zip 2.kali的ip 命令:ifconfig 3.靶機的ip 掃描靶機ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&am…

Linux內核分析 02

二&#xff0c;操作系統是如何工作的 1、函數調用堆棧 三大法寶&#xff1a;存儲程序計算機 函數調用堆棧 中斷機制 堆棧&#xff1a;是C語言程序運行時必須的一個記錄調用路徑和參數的空間。是計算機內部現成的東西&#xff0c;我們直接使用。 包括函數調用框架、傳遞參數、保…

一 UI基本的用法

1. UIView的基本用法 //打印屏幕的寬和高CGRect screenBounds [[UIScreen mainScreen] bounds];NSLog("%f, %f", screenBounds.size.width, screenBounds.size.height);//創建一個UIView//UIView表示一個矩形區域UIView *v1 [[UIView alloc] init];//1.確定大小CGR…

靶場練習第十八天~vulnhub靶場之hackableII

一、準備工作 kali和靶機都選擇NAT模式&#xff08;kali與靶機同網段&#xff09; 1.靶場環境 下載鏈接:Hackable: II ~ VulnHub 2.kali的ip 命令:ifconfig 3.靶機的ip 掃描靶機ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;掃描靶機開…

Object-c基礎(2)

類和對象 類 在Object-c中類&#xff0c;其接口&#xff08;interface&#xff09;和實現&#xff08;implementation&#xff09;是分離開來的 類的聲明 interface 類名:父類名{實例變量的定義;}方法聲明;...end類的實現 implementation 類名方法定義...end對象 一個類提供…

arm linux 下移植busybox 的tftp

&#xff08;1&#xff09;進入busybox目錄&#xff0c;make menuconfig &#xff0c;然后在networking中勾選tftp項跟tftpd項。 &#xff08;2&#xff09;配置/etc/inetd.conf 中關于tftp的選項&#xff08;此部未驗證&#xff0c;不需要應該也可以&#xff09; tftp dgra…

靶場練習第二十天~vulnhub靶場之Funbox: Scriptkiddie

一、環境搭建 靶官網機下載地址&#xff1a;Funbox: Scriptkiddie ~ VulnHub 百度云盤下載鏈接: 百度網盤 請輸入提取碼 提取碼: i4a9 二、信息收集 1.nmap命令掃描靶機 先用ifconfig查看kali的IP&#xff0c;因為kali和靶機都是NAT模式下&#xff0c;所以用 nmap 192.168…

documentbodyscrollTop的值總為零的解決辦法

有一個功能需要判斷返回頂部按鈕是否顯示。 JS代碼如下&#xff1a; var sTop document.body.scrollTop;if(sTop>100){document.getElementById("sm_top").style.display"block";}else{document.getElementById("sm_top").style.display&quo…

spring mvc 多線程并發

ThreadLocal為解決多線程程序的并發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多線程程序。 http://www.xuebuyuan.com/1628190.html 我們知道Spring通過各種DAO模板類降低了開發者使用各種數據持久技術的難度。這些模板類都是線程安全的&#xff0c;也就…

靶場練習第十九天~vulnhub靶場之GreenOptic: 1

一、準備工作 kali和靶機都選擇NAT模式&#xff08;kali與靶機同網段&#xff09; 1.靶場環境 下載鏈接:GreenOptic: 1 ~ VulnHub 2.kali的ip 命令:ifconfig 3.靶機的ip 掃描靶機ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;掃描靶機開…

靶場練習第二十五天~vulnhub靶場之Raven-2

一、準備工作 kali和靶機都選擇NAT模式&#xff08;kali與靶機同網段&#xff09; 1.靶場環境 下載鏈接:Raven: 2 ~ VulnHub 2.kali的ip 命令:ifconfig 3.靶機的ip 掃描靶機ip sudo arp-scan -l 二、信息收集 1.nmap的信息收集 &#xff08;1&#xff09;掃描靶機開放的…

每天一個linux命令(46):vmstat命令

vmstat是Virtual Meomory Statistics&#xff08;虛擬內存統計&#xff09;的縮寫&#xff0c;可對操作系統的虛擬內存、進程、CPU活動進行監控。他是對系統的整體情況進行統計&#xff0c;不足之處是無法對某個進程進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方…

用TypeScript開發了一個網頁游戲引擎,開放源代碼

最開始學習電腦編程的原動力之一就是想自己編寫游戲&#xff0c;一方面很好奇這些游戲是怎么做出來的&#xff0c;另一方面覺得有些地方設計的不合理&#xff0c;希望電腦游戲既能讓人玩的有趣&#xff0c;又不浪費時間。 學校五年&#xff0c;畢業十年&#xff0c;學用了十多種…