(學習2)Floyd和Dijkstra演算法

2022-07-20 01:57:14 字數 2699 閱讀 8558

floyd演算法

演算法解析:因為一張連通圖中不是所有點到其他點都是有一條直接路徑的,所以我們可以借助別的和終點相連的點到達終點,便是起點-中轉....-終點;

以小推大,

小:假設當前只有1可以當中轉點,start為起點,end為終點;因此當start點需要借助點1到end點時,便需要進行if(edge[start][end]>edge[start][1]+edge[1][end])的判斷,

這個判斷的意思就是 :我的起點到終點的路徑長度是否比中轉方法的長度長,這時我們當然需要優先選擇短的路徑,並且在edge[start][end]中更新,這樣就相當於我們就確定了一條start到end的最佳路徑。

大:理解了小例子後,我們就可以去推測圖上的其他所有點都可以作為某個start到某個end點的中轉點,因此通過不斷比較,不斷更新edge[start][end],我們最後就可以得到start點到end點的最短距離矩陣。

輸入:頂點數,邊數;有向圖;   

輸入格式:起點 終點 路徑長度;

樣例:4 8

1 2 2

1 3 6

1 4 4

2 3 3

3 1 7

3 4 1

4 1 5

4 3 12

偽**:

1 floyd(g)
view code

原始碼

1 #include 2 #include 3 #include 4 #include 5 #include 

6using

namespace

std;

7const

int maxen=200;8

const

int maxx=9999;9

intedge[maxen][maxen];

10void init(int n)18}

19}20void floyd(int n)27}

28}29}

30}31int

main()

40floyd(n);

41for(int i=1;i<=n;++i)

45 printf("\n"

);46}47

return0;

48 }

view code

演算法時間複雜度:o(n³)  分析:演算法需要執行三個巢狀迴圈,所以需要n³

dijkstra演算法

介紹:用於計算乙個節點到其他節點的最短距離的演算法。

個人演算法分析  1:設兩個集合a和b,a中是訪問過被收納入集合的點,b是還未訪問過的點;

2:設乙個陣列visit,這個陣列記錄每個頂點是否被訪問過;

3:先將起點納入集合a,並且標記訪問為true;

4:找出離起點最短距離的邊,然後更新圖中每個點到起點距離。(就是以找到的這個點為中轉點,判斷其他點是否能夠通過這個點與起點距離拉近)

5:重複步驟4,直至所有點被訪問過;

時間複雜度:o(n²)

樣例

8 11

1 2 1

2 4 2

3 1 2

4 3 1

4 6 8

5 4 2

5 7 2

6 5 2

7 6 3

7 8 3

8 6 2

**:

1 #include 2 #include 3 #include 4 #include 5 #include 

6using

namespace

std;

7const

int maxen=200;8

const

int maxx=9999;9

int edge[maxen][maxen];//

邊矩陣

10int visit[maxen];//

記錄被訪問過的點

11int lowcost[maxen];//

起到到每條邊的最短距離

12void init(int n)

17for(int i=1;i<=n;i++)24}

25}26void dijkstra(int start,int

n)35

}36 visit[index]=true; //

標記訪問

37for(int k=1;k<=n;k++)41}

42}43}

44int main(void

) 54

int start=1;//

起點為點1

55 lowcost[start]=0;//

起點到本身的距離為0

56 visit[start]=true; //

起點標記已訪問狀態

57dijkstra(start,n);

58 printf("

%d\n

",lowcost[8]);//

輸出點1到點8的距離

59return0;

60 }

view code

github:

演算法分析與實踐 作業2 Floyd演算法

用floyd演算法求解下圖各個頂點的最短距離。最大容量 define vertextype int 頂點型別 define inf 65535 象徵無窮大 typedef struct graph 鄰接矩陣 int p num num 前驅表 int vexnum,arcnum vernum為頂點個...

PHP學習2 類和物件

類和物件 1.不可定義stdclass類 2.php中 打頭的被視為魔術函式,sleep 和 wakeup 在 php 類中是魔術函式,不能命名函式,建議不要在 php 中將函式名以 開頭。3.類的定義和使用類似與c 中的類,在成員引用類於其中的指標,外加 4.類的繼承只能是單繼承,順序繼承下去 5...

學習筆記(2) 棧和佇列

棧和佇列都是線性結構,是特殊的線性表。棧 僅在表尾進行插入或刪除元素的操作。表尾稱為棧頂,表頭稱為棧底。不含元素的空表為空棧。又稱為 先進後出 線性表。棧有兩種儲存結構 順序儲存和鏈式儲存 與線性表類似 設定top指標指向棧頂位置,base指標指向棧底位置,當top base 時,棧為空棧。使用c語...