次短路模板 求任意两点间的次短路

.

 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 }

猜你喜欢

转载自www.cnblogs.com/pangbi/p/11845683.html