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...