题意:输入u,r表示有n个点,r条无向边
输出1到n的次短路。
题解:单源最短路,使用优先队列优化。模板题。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<map> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f struct edge { int to,cost; }; typedef pair<int,int> P;//first是最短距离,second是顶点的编号 int n,r; vector<edge>G[100005]; int d[100005]; int dist[100005],dist2[100005];//最短路和次短路 void dijkstra() { priority_queue<P,vector<P>,greater<P> >que;//从小到大的优先队列 fill(dist,dist+n,INF); fill(dist2,dist2+n,INF); dist[0]=0; que.push(P(0,0)); while(!que.empty()) { P q=que.top(); que.pop(); int v=q.second,d=q.first; if(dist2[v]<d) continue; for(int i=0;i<G[v].size();i++) { edge &e=G[v][i]; int d2=d+e.cost; if(dist[e.to]>d2) { swap(dist[e.to],d2); que.push(P(dist[e.to],e.to)); } if(dist2[e.to]>d2&&dist[e.to]<d2) { dist2[e.to]=d2; que.push(P(dist2[e.to],e.to)); } } } cout<<dist2[n-1]<<endl; } int main() { int a,b,c; while(cin>>n>>r) { for(int i=0;i<n;i++) G[i].clear(); for(int i=0;i<r;i++) { scanf("%d%d%d",&a,&b,&c); a--; b--; G[a].push_back(edge{b,c});//存放边 //在结构体重存数用花括号 G[b].push_back(edge{a,c});//无向边 } dijkstra(); } return 0; }