1. 程式人生 > 其它 >次短路演算法

次短路演算法

ACWing1133. 第二短路

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int,int> pii;
 4 const int N=1e5+5;
 5 int dis1[N],dis2[N],ans=INT_MAX;
 6 vector<pii>G[N];
 7 struct cmp
 8 {
 9   bool operator ()(pii &a,pii &b)
10     {
11       return a.second>b.second;
12 } 13 }; 14 void dijkstra() 15 { 16 priority_queue<pii,vector<pii>,cmp>q; 17 q.push({1,0}); 18 while(q.size()) 19 { 20 auto p=q.top(); 21 int u=p.first,d=p.second; 22 q.pop(); 23 for(int i=0;i<G[u].size();i++) 24 { 25 int vv=G[u][i].first,w=G[u][i].second;
26 if(d+w<dis1[vv]) 27 { 28 dis2[vv]=dis1[vv]; 29 dis1[vv]=d+w; 30 q.push({vv,d+w}); 31 } 32 else if(d+w>dis1[vv]&&d+w<dis2[vv]) 33 { 34 dis2[vv]=d+w; 35 q.push({vv,d+w}); 36 } 37 } 38 39 } 40 41
} 42 int main() 43 { 44 int n,m; 45 scanf("%d%d",&n,&m); 46 memset(dis1,0x3f,sizeof(dis1)); 47 memset(dis2,0x3f,sizeof(dis2)); 48 for(int i=1;i<=m;i++) 49 { 50 int u,v,w; 51 scanf("%d%d%d",&u,&v,&w); 52 G[u].push_back({v,w}); 53 G[v].push_back({u,w}); 54 } 55 dijkstra(); 56 cout<<dis2[n]<<endl; 57 return 0; 58 }