求解最短路問題的幾種方法總結

2021-08-25 19:37:02 字數 2308 閱讀 8508

1、spfa求單源最短路,鏈式前向星存圖, 時間複雜度o(ke) k是常數,大多數情況下為2。

#include #include #include using namespace std;

const int n = (int) 1e5 + 11; // 最大點數

const int m = (int) 1e6 + 11; // 最大邊數

const int inf = (int) 0x3f3f3f3f;

struct edge

edge(int _to, int _val, int _next)

}edge[m << 1]; // !!如果是雙向圖的話,邊的數量是題目中描述的二倍

int n, m; // n 是圖中的點數,m是圖中的邊數

int head[n], top;

void init(int n)

void add(int u, int v, int val)

void getmap(int m)

}bool vis[n]; int dis[n];

void spfa(int st, int ed)

}} }

printf("%d\n", dis[ed] == inf ? -1 : dis[ed]); // st到不了ed輸出-1

}int main()

2、 djk求單源最短路,鄰接矩陣存圖, 時間複雜度o(n^2)。

#include #include #include using namespace std;

const int n = (int) 1000 + 11; // 最大點數

const int inf = (int) 0x3f3f3f3f;

int n, m; // n是點的個數,m是邊的個數

int mp[n][n];

void init(int n) }}

void getmap(int m)

}bool vis[n]; int dis[n];

void djk(int st, int ed)

vis[st] = true;

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

} if(id == -1) break;

vis[id] = true; // 標記

for(int j = 0; j < n; j++)

} }printf("%d\n", (dis[ed] == inf) ? -1 : dis[ed]);

}int main()

3、 優先佇列優化的djk求單源最短路,鏈式前向星存圖 ,時間複雜度o(e * log(v))。

#include #include #include using namespace std;

typedef pairpii;

const int n = (int) 1e5 + 11; // 最大點數

const int m = (int) 1e6 + 11;

const int inf = (int) 0x3f3f3f3f;

struct edge

edge(int _to, int _val, int _next)

}edge[m << 1]; // !!如果是雙向圖的話,邊的數量是題目中描述的二倍

int n, m; // n 是圖中的點數,m是圖中的邊數

int head[n], top;

void init(int n)

void add(int u, int v, int val)

void getmap(int m)

}int dis[n];

void djk(int st, int ed)

} }printf("%d\n", dis[ed] == inf ? -1 : dis[ed]);

}int main()

4、floyd求多源最短路,鄰接矩陣存圖 時間複雜度o(n^3),可求得任意兩個點之間的最短距離。

#include #include #include using namespace std;

const int n = (int) 1000 + 11;

const int inf = (int) 0x3f3f3f3f;

int n, m;

int mp[n][n];

void init(int n) }}

void getmap(int m)

}void floyd(int n)

} }}int main()

最短路的幾種演算法

單源無負權最短路 dijkstra 多源無負權最短路 floyd 單源負權最短路 bellman ford,spfa 以hdu 2544為例 dijkstra include using namespace std typedef pair int,int par const int maxv 1e...

多條最短路徑的求解

最近在練習pat,遇到乙個要求解最短路徑的題,很自然地想起了這學期剛學的迪傑斯特拉演算法。但是這個問題要求解多條最短路徑,而迪傑斯特拉演算法只能求出其中一條最短路徑及其距離,所以要在運用迪傑斯特拉演算法演算法的基礎上,想想怎樣求解多條最短路徑。後來受到某個的啟發,想到了乙個解決辦法,演算法思想大概如...

Floyd演算法求解多元最短路徑問題

問題描述 對於多個目標地a,b,c 求解兩地之間的最短路徑問題,例如求解 a c的距離,常見的解有兩種,一種是直接由a c,另一種是經過某個中轉地再到達目的地,即a b c,其中中轉地可以是n個。floyd演算法解釋 floyd演算法的核心思想是將多地間的距離構建為乙個距離矩陣 即二維陣列 然後再通...