資料結構 最短路徑和最小生成樹

2021-08-21 21:07:36 字數 2758 閱讀 9689

本來我今天要是搞懂了線段樹我就想寫線段樹的模板,還是要幾天去消化一下裡面的道理。所以今天就炒一炒冷飯吧,嘻嘻。可能大家都了解這些**,畢竟是資料結構的主要內容,但是自己實現起來還是不一樣的,可以敲一敲我發的題目。

多源最短路 弗洛伊德演算法

先發題目鏈結 hdu 2066 戳這裡

先寫這個主要是這個思路比較清晰,容易寫一點,缺點就是時間複雜度比較高,如果不去剪枝的話很容易超時,不過剪枝的難度不高,所以總體來說求所有點的最短路徑用這個就對了。

這個演算法的核心思想就是乙個三重迴圈,最外層的迴圈我們可以把它叫做中間點(意思就是 如果我們要求兩個點的最短距離 需要判斷這兩個點的最短路程需不需要這這第三個點的參與),裡面的乙個二重迴圈你可以理解為起點和終點。(所以按照2066 可以敲一下)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 5000

int d[1001][1001]; /*存資訊*/

int main()

/*初始化圖資訊*/

for(int i=0;iint a,b,time;

cin>>a>>b>>time;

if(b>maxd)

maxd=b;

if(a>maxd)

maxd=a;

/*因為該題沒說圖的邊界問題,所以只能找最遠的點為邊界了*/

if(d[a][b]>time)

/*考慮重邊的情況,找最小的邊*/

} for(int k=0;k<=maxd;k++)

} /*弗洛伊德演算法*/

for(int i=0;icin>>c[i];

for(int j=0;jcin>>e[j];

for(int i=0;ifor(int j=0;jif(d[c[i]][e[j]]0)

min=d[c[i]][e[j]];

cout

}}

單源最短我還沒敲過,所以特意去敲了一道題(我自己都有點愛我自己)

hdu 2544 戳這裡

具體思想

確定你要求的起點。

按照你的起點初始化你的距離資訊(就是起點到各個點的距離,如果到不了就設為乙個較大值表示為無法到達)。

然後選取乙個最小的邊,連線起來,再修改距離的資訊(如果起點經過該點再到終點的距離 小於 從起點到終點的距離就修改資訊。

最後當遍歷完所有點以後,陣列裡面的資訊就是最短路徑了。

下面是ac** 注意(無窮大值一定要蠻大 不然報錯)

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 200000

int map1[500][500];

int d[500];

int vis[500];

int main()

else

if(cfor(int i=1;i<=n;i++)

d[i]=map1[1][i];

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

cout

<最小生成樹 克魯斯卡爾演算法

為什麼不講prime 因為我覺的那個方法不好理解,還容易和最短路徑搞混,所以我超級討厭用那個演算法,如果想學prime 請出門右轉。

hdu 1301 戳這裡

具體思路

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 5000

int map1[1001][1001];

int f[1001];

int n,m;

char a;

struct node;

bool cmp(node x,node y)

return r;

}void join(int x,int y)

int main()

for(int i=0;i1;i++)

}

for(int i=0;ifor(int i=0;ifor(int j=0;j<=i;j++)

}sort(p,p+k,cmp);

for(int i=0;iif(find(p[i].s)!=find(p[i].e))

}cout

<記住好嗎!!!!!!!!

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

首先介紹這三個概念,很多人都聽過最短路徑了,但是最短路徑樹卻很少聽過,關於最短路徑樹的介紹也不太多。而最短路徑樹和最小生成樹更是完全不同的兩個概念。最短路徑就是從乙個指定的頂點出發,計算從該頂點出發到其他所有頂點的最短路徑。通常用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號城市到其他城...