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演算法的核心思想是將多地間的距離構建為乙個距離矩陣 即二維陣列 然後再通...