模板 最短路模板 最小路徑生成樹

2021-10-08 16:11:56 字數 2858 閱讀 3563

o((

n+m)

logn

)o((n+m)logn)

o((n+m

)log

n)只能用於正權圖

#include

using

namespace std;

const

int n=

1e5+5;

int n,m,st,ed,dis[n]

;bool vis[n]

;struct edge

;int

read()

while

(c>=

'0'&&c<=

'9')

return x*f;

}priority_queueint,

int>

> q;

vector son[n]

;void

add(

int x,

int y,

int z));

son[y]

.push_back

((edge));

}void

dijkstra()

}}}int

main()

dijkstra()

;printf

("%d"

,dis[ed]);

}

o(n

m)

o(nm)

o(nm)

如果n-1次鬆弛後仍然不滿足三角形不等式,則說明有負環(這個環內每次都可以更新,因為一次比一次小),否則就沒有負環(可以收斂)。

注意:有負環時bellman演算法已經崩潰了,不能作為任何答案,所以雖然在負權下可以工作,但容易re

判環+輸出路徑

#include

using

namespace std;

int n,m,st,ed,dis[

505]

,num[

505]

,pre[

505]

;struct edgee[

20005];

void

print

(int x)

print

(pre[x]);

printf

("%d "

,x);

}bool

bellman_ford

(int s)}}

for(

int j=

1;j<=m;j++)}

return1;

}int

main()

scanf

("%d%d"

,&st,

&ed);if

(bellman_ford

(st)

)else

printf

("no solution");

}

o(k

n)

o(kn)

o(kn

),但容易被卡(尤其是稠密圖)

基於佇列優化的bellman演算法,負權圖同樣可以工作

可以用num

[]

numnu

m[]陣列記錄路徑長度,只要有鬆弛操作就令num

[v]=

num[

u]+1

num[v]=num[u]+1

num[v]

=num

[u]+

1,若num

[v

]>

nnum[v]>n

num[v]

>

n則說明有負環

#include

using

namespace std;

const

int maxn=

100005

;int n,m,dis[maxn]

;bool vis[maxn]

;void

read

(int

&x)while

(c>=

'0'&&c<=

'9')

x*=f;

}struct edge

edge

(int v,

int w)};

queue<

int> q;

vector v[maxn]

;void

spfa()

}}}}

intmain()

spfa()

;printf

("%d"

,dis[n]);

}

eg.黑暗城堡

解析:對於1到i

ii的最短路,事實上存在j

jj使dis

[i]=

dis[

j]+g

(j,i

)dis[i]=dis[j]+g(j,i)

dis[i]

=dis

[j]+

g(j,

i)這給我們啟發:j

jj的最短路與i

ii的最短路存在聯絡

如果把每乙個i

ii與前繼j

jj連起來,可以發現一定找得到這個j

jj,那麼i

ii的最短路一定由j

jj貢獻,就只需要考慮j

jj的最短路了。

題目又告訴我們這是乙個樹形結構,且沒有負邊,邊是n-1,剛好n個點,所以每個點i

ii只能找乙個前繼點j

jj,我們只需統計num[i]表示滿足條件的j的個數,然後把num[1~n]相乘即可。

至於求dis[i],可以用dijkstra預處理完成。

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

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

最短路徑 最小生成樹

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

最短路徑 最小生成樹

今天覆習的時候,剛好複習的這一塊,所以就簡單做乙個備忘,寫的潦草還望大家不要介意呀 1 dijistra演算法 思路 根據點集合將其分為兩個集合,一種是已經訪問過的點s集合 代表從源點到該集合中的點的距離最小 另一種是未訪問過的u集合,然後每次從u集合中選擇節點,使得源點到改點的距離最小,並新增進s...