最短路筆記(簡單過過)

2022-09-01 15:33:17 字數 2937 閱讀 6571

這個比較簡單,但是還是要複習一下的

什麼是圖

最短路演算法

各個演算法的複雜度

相關題目

圖(graph):是由一種由頂點(vertex)非空有限集合和頂點之間邊(edge)的集合組成的資料結構,表示為g(v,e)。

其中,g為圖,v為頂點集合,e為邊的集合。頂點集合有窮非空,邊集合可以為空。

簡單來說也就兩種:有向圖和無向圖。

時間複雜度 o(n3)。

這個演算法其實就是乙個大暴力,

在題目資料範圍 ≤500的情況下,建議使用。(畢竟**量少啊)

演算法思路

對於兩個點i,j,兩個點的最短路為disij

從1到n列舉乙個k,

如果disik+diskj

ij (即讓k為乙個中間商一樣的東西)

那我們就讓disij更新。

**實現

void floyd()

}}

時間複雜度:o(n2)(可優化到o(n log n))

可以說是最常用的了,因為優化後很穩定。不像spfa

注意:有負權值時不得使用(spfa上場了)

演算法思路

每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑。

借用了aw頓頓的一幅圖,別介意qwq

舉個例子

求a到e的最短距離。

答案是:11。

個人感覺這種手算用spfa不容易錯,但dij更容易些吧。

過程:一開始,disb=3,disf=6,disg=4

找a相鄰的最短邊且沒遍歷過的邊,即b,那disc=4,disd=10。

找b相鄰的最短邊且沒遍歷過的邊,即c,那dise=12,disf=5。

找c相鄰的最短邊且沒遍歷過的邊,即f,那dise=11,disd=7。

(由於作者懶,已經推出了正確路徑後,後面的模擬就懶得做了,於是不寫了)

**實現

普通版本

#include#define maxn 0x7fffffff

using namespace std;

int dist[5001],n,m,edge[5001][5001],minn,idx,s;

bool vis[5001];

void dijkstra()}}

}

int main()

for(int i=0;i>x>>y>>len;

edge[x][y]=len;

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

vis[s]=1;

dijkstra();

for(int i=1;i<=n;i++)cout優化版本(用了簡單的優先佇列)

#includeusing namespace std;

#define maxn 100050

#define maxm 500005

#define inf 1234567890

struct edge

e[maxm];

int head[maxn],cnt,n,m,s,vis[maxn],dis[maxn];

struct node

};priority_queueq;

inline void add(int u,int v,int w)

void dijkstra()

dis[s]=0;

q.push((node));

while(!q.empty()));}

}}}int main()

dijkstra();

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

return 0;

}

它死了

時間複雜度:o(nm)(最壞情況,即菊花圖)

但它可以實現有負權值的情況。

演算法思路

大概思路就是從起點出發,每個點(除了起點)到起點的距離設為inf

此時將起點入隊(queue)

用while語句當佇列不為空時

每次提取隊頭元素(x),

找到隊頭相鄰的點(y),

接著作比較if(disx+exy

y)(eij表示i到j的邊長)

如果disy發生了改變,

並且y不在佇列,那就把y放入佇列。

**實現

#include#include#include#include#include#include#include#define inf 999999999

using namespace std;

const int n=4e6+50;

int n,m,x,y,tot,f[n],bo[n],e[n],b;

long long dis[n];

struct edge

a[n];

void add(int ue,int ve,int we)

void spfa(int u)

dis[u]=0;

que.push(u);

e[u]=1;

bo[u]=1;

while(!que.empty())}}

}}int main()

spfa(1);

cout注:如果spfa被卡,可以用duque優化。

floyd:o(n3)

dijkstra:o(n log n)(優化後的)

spfa:o(mn)

簡單最短路

a 最短路 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是...

A 最簡單的最短路 最短路徑

szu 2015 winter training day 6 a 最簡單的最短路 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 1874 description 某省...

Yaroslav and Time 簡單最短路

sample input input 3 1000 1000 0 00 1 0 3output 2000 input 3 1000 1000 1 01 1 1 2output 1000 題意 座標上有n個點,沒走一步要花d時間 除了起點和終點,其他的點都有個寶箱,每個寶箱可以加時間 輸出從起點到終點...