题意:一个无向图,求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;
}
本文介绍了一种基于Kruskal算法改进的方法来解决无向图中从节点1到节点n的次短路径问题。核心思路在于通过维护两个距离数组分别记录最短路径与次短路径的距离。
855

被折叠的 条评论
为什么被折叠?



