這題用Dijkstra+priority_queue即可解出。queue中可能會有重複的node id,不過無妨,如果拜訪過的話會被pop出來。
//ignore header files
struct Node{
int id;
unsigned int dis;
bool operator<(Node n) const{
return dis>n.dis;
}
};
struct Edge{
int id;
int w;
};
using namespace std;
int main(int argc, char *argv[])
{
int c;
string s;
vector<int> q;
while(scanf("%d",&c) != EOF){
for(int o = 1;o <= c;o++){
vector<Edge> list[20005];
unsigned int weight[20005];
bool visit[20005] = {0};
int n,m,s,t;
scanf("%d %d %d %d",&n,&m,&s,&t);
while(m--){
int u,v,w;
Edge uv,vu;
scanf("%d %d %d",&u,&v,&w);
//cost
uv.w = w;
uv.id = v;
list[u].push_back(uv);
vu.w = w;
vu.id = u;
list[v].push_back(vu);
}
for(int i = 0;i<n;i++){
weight[i] = 1e9;
}
priority_queue<Node> PQ;
weight[s] = 0;
//printf("%d\n",s);
PQ.push((Node){s,weight[s]});
for(int i = 0;i<n;i++){
int a = -1;
while(!PQ.empty() && visit[a = PQ.top().id]){
PQ.pop();
}
if(a == -1){
break;
}
PQ.pop();
visit[a] = true;
for(size_t j = 0;j<list[a].size();j++){
Edge b = list[a][j];
if(!visit[b.id] && weight[a]+b.w < weight[b.id]){
weight[b.id] = weight[a]+b.w;
PQ.push((Node){b.id,weight[b.id]});
}
}
}
if(weight[t]<1e9){
printf("Case #%d: %d\n",o,weight[t]);
}else{
printf("Case #%d: unreachable\n",o);
}
}
}
return 0;
}