Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others)
Total Submission(s): 525 Accepted Submission(s): 265
php
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 } pre[maxn]; 21 vector<edge>G[maxn],T[maxn]; 22 priority_queue<P,vector<P>,greater<P> >q; 23 ll dist[maxn]; 24 25 void addedge(int u,int v,ll w) 26 { 27 G[u].push_back((edge) 28 { 29 u,v,w 30 }); 31 T[v].push_back((edge) 32 { 33 v,u,w 34 }); 35 } 36 void dij(int s) 37 { 38 dist[s]=0LL; 39 q.push(P(dist[s],s)); 40 while(!q.empty()) 41 { 42 P p=q.top(); 43 q.pop(); 44 int u=p.second; 45 for(int i=0; i<T[u].size(); i++) 46 { 47 edge e=T[u][i]; 48 if(dist[e.to]>dist[u]+e.w) 49 { 50 dist[e.to]=dist[u]+e.w; 51 q.push(P(dist[e.to],e.to)); 52 } 53 } 54 } 55 } 56 struct node 57 { 58 int to; 59 ///g(p)爲當前從s到p所走的路徑的長度;dist[p]爲點p到t的最短路的長度; 60 ll g,f;///f=g+dist,f(p)的意義爲從s按照當前路徑走到p後再走到終點t一共至少要走多遠; 61 bool operator<(const node &x ) const 62 { 63 if(x.f==f) return x.g<g; 64 return x.f<f; 65 } 66 }; 67 68 ll A_star(int s,int t,int k) 69 { 70 priority_queue<node>Q; 71 if(dist[s]==INF) return -1; 72 int cnt=0; 73 if(s==t) k++; 74 ll g=0LL; 75 ll f=g+dist[s]; 76 Q.push((node) 77 { 78 s, g, f 79 }); 80 while(!Q.empty()) 81 { 82 node x=Q.top(); 83 Q.pop(); 84 int u=x.to; 85 if(u==t) cnt++; 86 if(cnt==k) return x.g; 87 for(int i=0; i<G[u].size(); i++) 88 { 89 edge e=G[u][i]; 90 ll g=x.g+e.w; 91 ll f=g+dist[e.to]; 92 Q.push((node) 93 { 94 e.to, g, f 95 }); 96 } 97 } 98 return -1; 99 } 100 void init(int n) 101 { 102 for(int i=0; i<=n+10; i++) G[i].clear(),T[i].clear(); 103 } 104 int main() 105 { 106 int n,m; 107 int t; 108 scanf("%d",&t); 109 while(t--){ 110 scanf("%d%d",&n,&m); 111 for(int i=1; i<=m; i++) 112 { 113 int u,v; 114 ll w; 115 scanf("%d%d%lld",&u,&v,&w); 116 addedge(u,v,w); 117 addedge(v,u,w); 118 } 119 for(int i=0; i<=n; i++) dist[i]=INF; 120 dij(n); 121 printf("%lld\n",A_star(1,n,2)); 122 init(n); 123 } 124 return 0; 125 }