最短路徑問題

2021-06-23 02:55:19 字數 2904 閱讀 8945

兩種算發:  克魯斯卡爾演算法    floyd演算法

1演算法定義

克魯斯卡爾演算法

假設 wn=(v,) 是乙個含有 n 個頂點的連通網,則按照克魯斯卡爾演算法構造最小生成樹的過程為:先構造乙個只含 n 個頂點,而邊集為空的子圖,若將該子圖中各個頂點看  成是各棵樹上的根結點,則它是乙個含有 n 棵樹的乙個森林。之後,從網的邊集 e 中選取一條權值最小的邊,若該條邊的兩個頂點分屬不同的樹,則將其加入子圖,也就是說,將這兩個頂點分別所在的兩棵樹合成一棵樹;反之,若該條邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之。依次類推,直至森林中只有一棵樹,也即子圖中含有 n-1條邊為止。

2舉例描述

克魯斯卡爾演算法(kruskal's algorithm)是兩個經典的最小生成樹演算法的較為簡單理解的乙個。這裡面充分體現了貪心演算法的精髓。大致的流程可以用乙個圖來表示。這裡的圖的選擇借用了wikipedia上的那個。非常清晰且直觀。

首先第一步,我們有一張圖,有若干點和邊

如下圖所示:

第一步我們要做的事情就是將所有的邊的長度排序,用排序的結果作為我們選擇邊的依據。這裡再次體現了貪心演算法的思想。資源排序,對區域性最優的資源進行選擇。

排序完成後,我們率先選擇了邊ad。這樣我們的圖就變成了

第二步,在剩下的邊中尋找。我們找到了ce。這裡邊的權重也是5

依次類推我們找到了6,7,7。完成之後,圖變成了這個樣子。

下一步就是關鍵了。下面選擇那條邊呢? bc或者ef嗎?都不是,儘管現在長度為8的邊是最小的未選擇的邊。但是他們已經連通了(對於bc可以通過ce,eb來連線,類似的ef可以通過eb,ba,ad,df來接連)。所以我們不需要選擇他們。類似的bd也已經連通了(這裡上圖的連通線用紅色表示了)。

最後就剩下eg和fg了。當然我們選擇了eg。最後成功的圖就是下圖:

到這裡所有的邊點都已經連通了,乙個最小生成樹構建完成。

kruskal演算法的時間複雜度由排序演算法決定,若採用快排則時間複雜度為o(n log n)。

c  **暫無;

floyd演算法又稱為,插點法,是一種用於尋找給定的加權圖中多源點之間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。

通過乙個圖的權值矩陣求出它的每兩點間的最短路徑矩陣。

從圖的帶權鄰接矩陣a=[a(i,j)] n×n開始,遞迴地進行n次更新,即由矩陣d(0)=a,按乙個公式,構造出矩陣d(1);又用同樣地公式由d(1)構造出d(2);……;最後又用同樣的公式由d(n-1)構造出矩陣d(n)。矩陣d(n)的i行j列元素便是i號頂點到j號頂點的最短路徑長度,稱d(n)為圖的距離矩陣,同時還可引入乙個後繼節點矩陣path來記錄兩點間的最短路徑。

採用的是(鬆弛技術),對在i和j之間的所有其他點進行一次鬆弛。所以時間複雜度為o(n^3);

其狀態轉移方程如下: map[i,j]:=min

map[i,j]表示i到j的最短距離,k是窮舉

i,j的斷點,map[n,n]初值應該為0,或者按照題目意思來做。

當然,如果這條路沒有通的話,還必須特殊處理,比如沒有map[i,k]這條路

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

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

把圖用鄰接矩陣g表示出來,如果從vi到vj有路可達,則g[i,j]=d,d表示該路的長度;否則g[i,j]=無窮大。定義乙個矩陣d用來記錄所插入點的資訊,d[i,j]表示從vi到vj需要經過的點,初始化d[i,j]=j。把各個頂點插入圖中,比較插點後的距離與原來的距離,g[i,j] = min( g[i,j], g[i,k]+g[k,j] ),如果g[i,j]的值變小,則d[i,j]=k。在g中包含有兩點之間最短道路的資訊,而在d中則包含了最短通路徑的資訊。

比如,要尋找從v5到v1的路徑。根據d,假如d(5,1)=3則說明從v5到v1經過v3,路徑為,如果d(5,3)=3,說明v5與v3直接相連,如果d(3,1)=1,說明v3與v1直接相連

時間複雜度:o(n^3);

空間複雜度:o(n^2);

floyd演算法適用於apsp(all pairs shortest paths),是一種動態規劃演算法,稠密圖效果最佳,邊權可正可負。此演算法簡單有效,由於三重迴圈結構緊湊,對於稠密圖,效率要高於執行|v|次dijkstra演算法。

優點:容易理解,可以算出任意兩個節點之間的最短距離,**編寫簡單

缺點:時間複雜度比較高,不適合計算大量資料。

**實現:

c

某省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。

現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。 input

本題目包含多組資料,請處理到檔案結束。

每組資料第一行包含兩個正整數n和m(0

#include#define max 10000000

int map[200][200];

void floyd(int n)

{int i,j,k;

for(i=0;i

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...