50pts,dis2求法求条玄关
查看原帖
50pts,dis2求法求条玄关
728840
covonant楼主2024/12/19 12:39
#include<bits/stdc++.h>
#define inf 2147483647
#define maxn 20005
using namespace std;
int n,m,cnt;
double dis[5][maxn],w[maxn];
int h[maxn],to[maxn],nxt[maxn];
int x[maxn],y[maxn];
bool vis[maxn];
priority_queue<pair<double,int> >q; 
//dis[1] 最短路 
//dis[2] 次短路  
double Dist(int x1,int y1,int x2,int y2){
	return 1.0*sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void prepare(){
	for(int i=0;i<=n;i++){
		dis[1][i]=dis[2][i]=inf;
	}
}
void addedge(int a,int b,double c){
	cnt++;
	w[cnt]=c;
	to[cnt]=b;
	nxt[cnt]=h[a];
	h[a]=cnt;	
}
void dijkstra(){
	prepare();
	dis[1][1]=0;
	q.push({0,1});
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(vis[u]) continue;;
		vis[u]=1;
		for(int i=h[u];i;i=nxt[i]){
			if(!vis[to[i]]&&dis[1][to[i]]>=dis[1][u]+w[i]){//比最短路还短 
				dis[2][to[i]]=dis[1][to[i]];
				dis[1][to[i]]=dis[1][u]+w[i];
				q.push({-dis[1][to[i]],to[i]});
			}
			else if(!vis[to[i]]&&dis[2][to[i]]>dis[1][u]+w[i]){
				dis[2][to[i]]=dis[1][u]+w[i];
				q.push({-dis[2][to[i]],to[i]});
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		double w=Dist(x[u],y[u],x[v],y[v]);
		addedge(u,v,w);
		addedge(v,u,w);
	}
	dijkstra();
	if(dis[2][n]==inf) cout<<-1;
	else cout<<fixed<<setprecision(2)<<dis[2][n];
	return 0;
} 
2024/12/19 12:39
加载中...