這個比較簡單,但是還是要複習一下的
什麼是圖
最短路演算法
各個演算法的複雜度
相關題目
圖(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時間 除了起點和終點,其他的點都有個寶箱,每個寶箱可以加時間 輸出從起點到終點...