最短路徑和最小生成樹常見演算法整理

2021-10-20 19:45:49 字數 2857 閱讀 9080

n點 m邊

1.spfa演算法最壞情況o(nm)一般情況下是線性的複雜度,當出現網格狀的資料時容易出現最壞情況,一般不會被卡,邊權可以是負數,但是不能有負環。最常用的演算法因此寫在第乙個。

演算法思想:該演算法又叫做佇列優化的bellman-ford演算法,再bellman-ford演算法將變小的儲存在佇列中(也就是會對距離產生變化的點)

#include

#include

#include

#include

using

namespace std;

int n,m;

const

int n=

1e5+10;

vectorint,

int>>g[n]

;int d[n]

;bool in_que[n]

;void

spfa()

}}if(d[n]

>

0x3f3f3f3f/2

)cout<<

"impossible"

;else cout

);}spfa()

;return0;

}

2.dijkstra演算法o(n*n)

#include

#include

using

namespace std;

int n,m;

const

int n=

510;

int g[n]

[n];

int d[n]

;bool v[n]

;void

dijkstra()

}if(d[n]

>=

0x3f3f3f3f

)cout<<-1

;else cout

dijkstra()

;return0;

}

3.堆優化的dijkstra o(m*log(n))

#include

#include

#include

#include

using

namespace std;

int n, m;

const

int n =

1.5e5+10

;vectorint,

int>>g[n]

;int d[n]

;bool v[n]

;void

dijkstra()

);while

(q.size()

));}

}}if(d[n]

>=

0x3f3f3f3f

)cout<<-1

;else cout << d[n];}

intmain()

);}dijkstra()

;return0;

}

最小生成樹

1.prim (樸素版)o(n*n)

該演算法跟dijkstra()演算法特別像,不同點在於prim演算法d陣列(dist)維護的是到最小生成樹的距離,prim演算法可以進行堆優化,不過一般不常用,再稀疏圖是kruskal演算法更常用。

#include

#include

using

namespace std;

int n,m;

const

int n=

510;

int d[n]

;int g[n]

[n];

bool tg[n]

;void

prim()

}int res=0;

for(

int i=

1;i<=n;i++

)res+

=d[i];if

(res>

0x3f3f3f3f/2

)cout<<

"impossible"

;else cout<}int

main()

prim()

;return0;

}

2.kruskal演算法 o(m*log(m))

演算法的時間複雜度主要取決於排序的時間複雜度。演算法的基本思想,將所有邊小到大進行排序,遍歷所有邊,看看是否連通,如果不連通加入。

#include

#include

using

namespace std;

int n,m;

const

int m=

2e5+10;

const

int n=

1e5+10;

struct edgeedges[m]

;int p[n]

;int

find

(int a)

void

merge

(int a,

int b)

bool

judge

(int a,

int b)

bool

cmp(edge a,edge b)

void

kruskal()

if(cnt==n-

1)cout

"impossible";}

intmain()

;}for(

int i=

1;i<=n;i++

)p[i]

=i;kruskal()

;return0;

}

最短路徑,最短路徑樹和最小生成樹

首先介紹這三個概念,很多人都聽過最短路徑了,但是最短路徑樹卻很少聽過,關於最短路徑樹的介紹也不太多。而最短路徑樹和最小生成樹更是完全不同的兩個概念。最短路徑就是從乙個指定的頂點出發,計算從該頂點出發到其他所有頂點的最短路徑。通常用dijkstra演算法,floyd演算法求解。最短路徑樹spt sho...

最小生成樹和最短路徑

這篇算作是 演算法 第四版部分讀後感吧 我思考這個問題的開始就是糾結最小生成樹prim演算法和最短路徑dijkstra演算法的異同 1.最小生成樹prim演算法 直接從例子開始吧,我們考慮一副這樣的圖 1.將d設為起始點 設定某個點為起始點是隨機的 考慮與它相鄰節點的權重值,圖中黃色節點,也就是d ...

最短路徑 最小生成樹

題目描述 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號 輸出描述 n 1行,表示0號城市到其他城...