.
1 #include<bits/stdc++.h> 2 #define mp(i,j) make_pair(i,j) 3 #define P pair<int,int> 4 using namespace std; 5 const int inf=0x3f3f3f3f; 6 const int maxn=5e3+10;; 7 int n,t; 8 int dis1[maxn],cdis[maxn]; 9 int judge[maxn]; //用来标记该点的单源最短(次短)路是否走过 10 vector <P> e[maxn], vis[maxn]; 11 void storage(int a,int b,int c) 12 { 13 e[a].push_back(mp(c,b)); //这里类似于矩阵的存边方式,mp的第一个元素是权值; 14 } 15 void book(int x) 16 { 17 for(int i=1;i<=n;i++) //将x的单源路径更新; 18 vis[x].push_back(mp(i,cdis[i])); 19 } 20 void dij(int a) 21 { 22 int to,w; 23 priority_queue <P, vector<P>, greater<P> > q; //优先队列,每次把最小的来更新 24 memset(dis1,inf,sizeof(dis1)); 25 memset(cdis,inf,sizeof(cdis)); //初始化 26 27 q.push(mp(0,a)); //把第一个点录入 28 dis1[a]=0; 29 30 while(!q.empty()){ 31 P u=q.top(); 32 q.pop(); 33 if(u.first>cdis[u.second]) //这里是优化之一,如果该点的权值比次短路的还大的话, 34 continue; //就跳过 35 for(int i=0;i<e[u.second].size();++i){ 36 //dis[v]>dis[u]+w //这里类似于这种; 37 int next=e[u.second][i].first+u.first; //dis[u]+w; 38 int now=e[u.second][i].second; //dis[v]; 39 if(next<dis1[now]){ 40 swap(dis1[now],next); 41 q.push(mp(dis1[now],now)); 42 } 43 if(next<cdis[now]) { 44 swap(cdis[now],next); 45 q.push(mp(cdis[now],now)); 46 } 47 } 48 } 49 book(a); 50 } 51 int main() 52 { 53 int m; 54 scanf("%d%d",&n,&m); 55 while(m--){ 56 int t1,t2,t3; 57 scanf("%d%d%d",&t1,&t2,&t3); 58 storage(t1,t2,t3); 59 } 60 int q; 61 scanf("%d",&q); 62 while(q--){ 63 int x,y; 64 scanf("%d%d",&x,&y); 65 if(!judge[x]) dij(x),judge[x]=1; 66 for(int i=0;i<vis[x].size();i++){ 67 if(vis[x][i].first==y){ 68 if(vis[x][i].second==inf) 69 printf("no route\n"); 70 else printf("%d\n",vis[x][i].second); 71 break; 72 } 73 } 74 } 75 return 0; 76 }