hud 1874スムーズエンジニアリングDijkstraアルゴリズムスタック最適化
2316 ワード
接続:http://acm.hdu.edu.cn/showproblem.php?pid=1874
Problem Description
ある省は何年も開通工事計画を実行してから、やっと多くの道を建設した.道が多くてもよくありません.一つの町から別の町に行くたびに、多くの道路案が選択できますが、いくつかの案は他の案よりも歩く距離が短いです.これは歩行者を困らせる.
これで、始点と終点がわかりました.始点から終点まで、最短でどのくらいの距離を歩く必要があるかを計算してください.
Input
このテーマには複数のデータが含まれています.ファイルが終わるまで処理してください.
各組のデータの第1行は、2つの正の整数NとM(0は、次に、M行の道路情報である.各行には、3つの整数A,B,X(0<=A,Bは、次の行に続く2つの整数S,T(0<=S,T)がある
Output
各グループのデータについては、最も短い走行距離を1行に出力してください.SからTまでの経路が存在しない場合は-1を出力します.
Sample Input
Problem Description
ある省は何年も開通工事計画を実行してから、やっと多くの道を建設した.道が多くてもよくありません.一つの町から別の町に行くたびに、多くの道路案が選択できますが、いくつかの案は他の案よりも歩く距離が短いです.これは歩行者を困らせる.
これで、始点と終点がわかりました.始点から終点まで、最短でどのくらいの距離を歩く必要があるかを計算してください.
Input
このテーマには複数のデータが含まれています.ファイルが終わるまで処理してください.
各組のデータの第1行は、2つの正の整数NとM(0は、次に、M行の道路情報である.各行には、3つの整数A,B,X(0<=A,Bは、次の行に続く2つの整数S,T(0<=S,T)がある
Output
各グループのデータについては、最も短い走行距離を1行に出力してください.SからTまでの経路が存在しない場合は-1を出力します.
Sample Input
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
Sample Output
2 -1
思路:用Dijkstra算法写了一次,用Bellman-Ford写了一次,又学了Dijkstra算法的堆优化,时间复杂度小,跟Prim优化方法十分相似,用优先队列储存,进入队列即被排序,减少一个for循环(话所最近看畅通工程看的好懵逼)
代码:
hdu1874 (Elogn);
#include
#include
#include
#include
#define maxn 200 + 10
#define INF 0x3f3f3f3f
using namespace std;
struct node {
int v, len;
node(int v = 0, int len = 0) :v(v), len(len) {}
bool operator < (const node &a)const { //
return len > a.len;
}
};
vectorG[maxn];
bool vis[maxn];
int dis[maxn];
void init() {
for (int i = 0; iQ;
Q.push(node(s, 0));//
dis[s] = 0;
while (!Q.empty()) {
node now = Q.top(); //
Q.pop();
int v = now.v;
if (vis[v]) continue; // continue
vis[v] = true;
for (int i = 0; i dis[v] + len) {
dis[v2] = dis[v] + len;
Q.push(node(v2, dis[v2]));
}
}
}
return dis[e];
}
int n, m;
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
init();
for (int i = 0; i