最短路 优先队列Dij
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <cstring> #include <iostream> #include <cstdio> #include <queue> #include <vector> #define N 100010 #define INF 0x3f3f3f3f using namespace std; typedef pair<int,int> pii; struct dat { int u,v,w,next; } a[N]; int n,m,s,t; int first[N],done[N],d[N]; void dij() { priority_queue<pii,vector<pii>,greater<pii> >q; memset(d, 0x3f, sizeof(d)); memset(done, 0, sizeof(done)); d[s]=0; q.push(make_pair(d[s],s)); while(!q.empty()) { pii x; x =q.top(); q.pop(); int u=x.second; if(done[u]) continue; done[u]=1; for(int i=first[u]; i!=-1; i=a[i].next) { int v=a[i].v; int w=a[i].w; if(d[u]+w<d[v]) { d[v]=d[u]+w; q.push(make_pair(d[v],v)); } } } } int main() { int vv,cas=0; scanf("%d",&vv); while(vv--) { scanf("%d %d %d %d",&n,&m,&s,&t); memset(first, -1, sizeof(first)); int u,v,w; for(int i=0; i<m; i++) { scanf("%d %d %d",&u,&v,&w); a[i*2].u=u; a[i*2].v=v; a[i*2].w=w; a[i*2].next=first[u]; first[u]=i*2; a[i*2+1].u=v; a[i*2+1].v=u; a[i*2+1].w=w; a[i*2+1].next=first[v]; first[v]=i*2+1; } dij(); printf("Case #%d: ",++cas); if(d[t]!=INF) printf("%d\n",d[t]); else printf("unreachable\n"); } return 0; }