【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)
生活随笔
收集整理的這篇文章主要介紹了
【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【Bellman-Ford算法】
【算法】Bellman-Ford算法(單源最短路徑問題)(判斷負圈)
結構:
#define MAX_V 10000 #define MAX_E 50000 int V,E; //頂點和邊的數量 struct edge{int from,to,cost; }; edge es[MAX_E];//邊集 int d[MAX_V]; //d[i]表示從某個點出發到i的最短路徑算法特點:1.每次都用所有的邊更新所有的邊,直到無可更新為止。
2.無負圈最多更新 V-1 次,否則有負圈。
【dijkstra算法】
【算法】Dijkstra算法(單源最短路徑問題)(路徑還原) 鄰接矩陣和鄰接表實現
結構1:
#define MAX_V 10000 #define MAX_E 50000 int cost[MAX_V][MAX_V]; //cost[u][v]表示e = (u,v)的權值 int d[MAX_V]; //源點s出發的最短距離 bool used[MAX_V]; //標記使用過的點 int V; //頂點數算法特點:1.每次都找沒使用過的 d 最小的點,用這個點更新其他點。
2.不能解決有負圈的圖。
結構2:
#define MAX_V 10000 #define MAX_E 50000 int V; //頂點數 int d[MAX_V]; // d[i]表示i離源點的最短距離 struct edge{ int to,cost; }; typedef pair<int, int> P; //first是最短距離,second是頂點的編號 vector <edge> G[MAX_V]; // 邊集算法特點:1.用之前更新過的點,來更新其他點,直到無點可更新。
2.不能解決有負圈的圖。
【Floyd-Warshall算法】
【算法】Floyd-Warshall算法(任意兩點間的最短路問題)(判斷負圈)
結構:
#define MAX_V 10000 #define MAX_E 50000 int d[MAX_V][MAX_V]; // d[u][v]表示邊e=(u,v)的權值(不存在時設為INF,不過d[i][i] = 0) int V; // 頂點數算法特點:1.dp[i][j] = min(dp[i][j] , dp[i][k] + d[k][j]);
基于只有k-1個點的情況,從加入第k個點和不加第k個點中做選擇。
2.能解決有負圈的圖,如果d[i][i]出現負數說明有負圈。
拜讀了一位大神的blog學會了SPFA算法:
【最短路算法】Dijkstra+heap和SPFA的區別
稠密圖用Dijkstra,稀疏圖用SPFA。
總結
以上是生活随笔為你收集整理的【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法】素数专题
- 下一篇: POJ 1979 Red and Bla