题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874
思路:话说这题刚开始队列优先级搞错样例居然也能过,害得我找了半天错。。其他没什么好说的。。。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <climits>
using namespace std;
const int MAXN = 205;
const int INF = INT_MAX;
struct Edge{
int to;
int length;
Edge(int t, int l): to(t), length(l) {}
};
struct Point{
int number;
int distance;
Point(int n, int d): number(n), distance(d) {}
bool operator< (const Point& c) const{
return distance > c.distance;
}
};
int N, M;
vector<Edge> graph[MAXN];
bool visit[MAXN];
int dis[MAXN];
void Initial(){
for(int i = 0; i < N; i++){
graph[i].clear();
}
fill(dis, dis + N, INF);
memset(visit, false, sizeof(visit));
}
void Dijkstra(int start){
dis[start] = 0;
priority_queue<Point> myqueue;
myqueue.push(Point(start, dis[start]));
while(!myqueue.empty()){
int from = myqueue.top().number;
myqueue.pop();
if(visit[from]) continue;
visit[from] = true;
for(int i = 0; i < graph[from].size(); i++){
int to = graph[from][i].to;
int d = graph[from][i].length;
if(dis[from] + d < dis[to]){
dis[to] = dis[from] + d;
myqueue.push(Point(to, dis[to]));
}
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
while(~scanf("%d %d", &N, &M)){
Initial();
int A, B, X, S, T;
for(int i = 0; i < M; i++){
scanf("%d %d %d", &A, &B, &X);
graph[A].push_back(Edge(B, X));
graph[B].push_back(Edge(A, X));
}
scanf("%d %d", &S, &T);
Dijkstra(S);
if(dis[T] == INF) printf("-1\n");
else printf("%d\n", dis[T]);
}
return 0;
}