第k短路和次短路模板
第k短路模板
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<vector> 10 #include<set> 11 using namespace std; 12 typedef long long ll; 13 typedef pair<ll,int> P; 14 const int maxn=2e5+100,maxm=2e5+100,inf=0x3f3f3f3f,mod=1e9+7; 15 const ll INF=1e17+7; 16 struct edge 17 { 18 int from,to; 19 ll w; 20 }; 21 vector<edge>G[maxn],T[maxn]; 22 priority_queue<P,vector<P>,greater<P> >q; 23 ll dist[maxn]; 24 void addedge(int u,int v,ll w) 25 { 26 G[u].push_back((edge) 27 { 28 u,v,w 29 }); 30 T[v].push_back((edge) 31 { 32 v,u,w 33 }); 34 } 35 void dij(int s) 36 { 37 dist[s]=0LL; 38 q.push(P(dist[s],s)); 39 while(!q.empty()) 40 { 41 P p=q.top(); 42 q.pop(); 43 int u=p.second; 44 for(int i=0; i<T[u].size(); i++) 45 { 46 edge e=T[u][i]; 47 if(dist[e.to]>dist[u]+e.w) 48 { 49 dist[e.to]=dist[u]+e.w; 50 q.push(P(dist[e.to],e.to)); 51 } 52 } 53 } 54 } 55 struct node 56 { 57 int to; 58 ///g(p)为当前从s到p所走的路径的长度;dist[p]为点p到t的最短路的长度; 59 ll g,f;///f=g+dist,f(p)的意义为从s按照当前路径走到p后再走到终点t一共至少要走多远; 60 bool operator<(const node &x ) const 61 { 62 if(x.f==f) return x.g<g; 63 return x.f<f; 64 } 65 }; 66 67 ll A_star(int s,int t,int k) 68 { 69 priority_queue<node>Q; 70 if(dist[s]==INF) return -1; 71 int cnt=0; 72 if(s==t) k++; 73 ll g=0LL; 74 ll f=g+dist[s]; 75 Q.push((node) 76 { 77 s, g, f 78 }); 79 while(!Q.empty()) 80 { 81 node x=Q.top(); 82 Q.pop(); 83 int u=x.to; 84 if(u==t) cnt++; 85 if(cnt==k) return x.g; 86 for(int i=0; i<G[u].size(); i++) 87 { 88 edge e=G[u][i]; 89 ll g=x.g+e.w; 90 ll f=g+dist[e.to]; 91 Q.push((node) 92 { 93 e.to, g, f 94 }); 95 } 96 } 97 return -1; 98 } 99 void init(int n) 100 { 101 for(int i=0; i<=n+10; i++) G[i].clear(),T[i].clear(); 102 } 103 int main() 104 { 105 int n,m; 106 scanf("%d%d",&n,&m); 107 for(int i=1; i<=m; i++) 108 { 109 int u,v; 110 ll w; 111 scanf("%d%d%lld",&u,&v,&w); 112 addedge(u,v,w); 113 addedge(v,u,w); 114 } 115 int s,t,k; 116 scanf("%d%d%d",&s,&t,&k); 117 for(int i=0; i<=n; i++) dist[i]=INF; 118 dij(t); 119 printf("%lld\n",A_star(s,t,k));//s到t的第k短路 120 init(n); 121 return 0; 122 }
次短路
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<stack> 9 #include<vector> 10 #include<set> 11 using namespace std; 12 typedef pair<int,int> P; 13 typedef long long ll; 14 const int maxn=2e5+100,inf=0x3f3f3f3f,mod=1e9+7; 15 const ll INF=1e15+7; 16 struct edge 17 { 18 int from,to; 19 ll cost; 20 }; 21 vector<edge>es; 22 vector<int>G[maxn]; 23 priority_queue<P,vector<P>,greater<P> >que; 24 void addedge(int u,int v,ll w) 25 { 26 es.push_back((edge) 27 { 28 u,v,w 29 }); 30 es.push_back((edge) 31 { 32 v,u,w 33 }); 34 int x=es.size(); 35 G[u].push_back(x-2); 36 G[v].push_back(x-1); 37 } 38 ll dist[maxn],dist2[maxn]; 39 int pre[maxn]; 40 void dij(int s) 41 { 42 dist[s]=0LL; 43 que.push(P(0LL,s)); 44 while(!que.empty()) 45 { 46 P p=que.top(); 47 que.pop(); 48 int u=p.second; 49 ll d=p.first; 50 if(dist2[u]<d) continue; 51 for(int i=0; i<G[u].size(); i++) 52 { 53 edge e=es[G[u][i]]; 54 ll w=d+e.cost; 55 if(dist[e.to]>w) 56 { 57 swap(dist[e.to],w); 58 pre[e.to]=G[u][i]; 59 que.push(P(dist[e.to],e.to)); 60 } 61 if(dist2[e.to]>w&&dist[e.to]<w) 62 { 63 dist2[e.to]=w; 64 que.push(P(dist[e.to],e.to)); 65 } 66 } 67 } 68 } 69 void init(int n) 70 { 71 es.clear(); 72 for(int i=0; i<=n+10; i++) G[i].clear(); 73 } 74 int main() 75 { 76 int T; 77 scanf("%d",&T); 78 while(T--) 79 { 80 int n,m; 81 scanf("%d%d",&n,&m); 82 for(int i=1; i<=m; i++) 83 { 84 int u,v; 85 ll w; 86 scanf("%d%d%lld",&u,&v,&w); 87 addedge(u,v,w); 88 } 89 for(int i=1; i<=n; i++) dist[i]=dist2[i]=INF; 90 dij(1);//起点是1 91 init(n); 92 } 93 return 0; 94 }