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
 
   
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