题意:使用优先队列的Dijkstra算法的模板题,注意数组的大小,要开两倍的M,因为我们存的是两次
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int MAXN = 21004; const int MAXM = 110004; const int INF = 0x3f3f3f3f; int n,m; int d[MAXM],vis[MAXM]; int u[MAXM],v[MAXM],w[MAXM],first[MAXM],next[MAXM]; struct node{ int w,id; friend bool operator<(node a,node b){ return a.w > b.w; } }; void dijkstra(int s,int t){ int e,x; node p; priority_queue<node> q; memset(vis,0,sizeof(vis)); memset(d,INF,sizeof(d)); d[s] = 0; p.w = 0,p.id = s; q.push(p); while (!q.empty()){ p = q.top(),q.pop(); x = p.id; d[x] = p.w; if (x == t) return; if (vis[x]) continue; vis[x] = 1; for (e = first[x]; e != -1; e = next[e]) if (!vis[v[e]] && d[v[e]]>d[x]+w[e]){ d[v[e]] = d[x] + w[e]; p.w = d[v[e]]; p.id = v[e]; q.push(p); } } } int main(){ int T,e,s,t,cas=0; int x,y,z; scanf("%d",&T); while (T--){ scanf("%d%d%d%d",&n,&m,&s,&t); memset(first,-1,sizeof(first)); e = 0; for (int i = 0; i < m; i++){ scanf("%d%d%d",&x,&y,&z); u[e] = x,v[e] = y,w[e] = z; next[e] = first[u[e]]; first[u[e]] = e; e++; u[e] = y,v[e] = x,w[e] = z; next[e] = first[u[e]]; first[u[e]] = e; e++; } dijkstra(s,t); if (d[t] == INF) printf("Case #%d: unreachable\n",++cas); else printf("Case #%d: %d\n",++cas,d[t]); } return 0; }