题意:一个无向图,求1~n的严格次短路。
思路:Kruskal算法改进。假设点x是与n连接的某个点,1-n的次短路要么是点1到相异于1-n最短路径上n的前驱的一个节点x的最短路+xn,要么是1-x最短路+xn。
#include<iostream> #include<cmath> #include<queue> #include<vector> #include<algorithm> #include<string.h> #include<cstdio> using namespace std; #define pii pair<int,int> #define INF 100000000 struct edge{ int u,v,cost; edge(int a,int b,int c){ u=a; v=b; cost=c; } }; vector<edge> G[5010]; int dist[5010]; int dist2[5010]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ dist[i]=INF; dist2[i]=INF; } dist[1]=0; for(int i=1;i<=m;i++){ int u,v,cost; scanf("%d%d%d",&u,&v,&cost); G[u].push_back(edge(u,v,cost)); G[v].push_back(edge(v,u,cost)); } priority_queue<pii,vector<pii>,greater<pii> > que; //小顶堆 que.push(pii(0,1)); while(!que.empty()){ pii cur=que.top(); que.pop(); int u=cur.second; if(dist2[u]<cur.first)continue; int siz=G[u].size(); for(int i=0;i<siz;i++){ int& v=G[u][i].v; int tmpd=cur.first+G[u][i].cost; //这里要注意不能是dist[v]+... if( tmpd < dist[v] ){ swap(dist[v],tmpd); que.push(pii(dist[v],v)); } if( dist2[v]>tmpd && tmpd>dist[v] ){ dist2[v]=tmpd; que.push(pii(dist2[v],v)); } } } cout<<dist2[n]<<endl; return 0; }