严格次短路模版
查看原帖
严格次短路模版
850632
North_encounter楼主2025/1/10 19:51

做法是Dijkstra两个数组记录

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e4+20;
const int M=1e5+20;
const int inf=1145141919;
inline int read(){
	int f=1,k=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		k=(k<<3)+(k<<1)+(c^48);
		c=getchar();
	}
	return f*k;
}

int cnt;
int head[N];
struct mouse_king{
	int v,next;
	double w;
}edge[2*M];

inline void add(int u,int v,double w){
	edge[++cnt].v=v;
	edge[cnt].next=head[u];
	edge[cnt].w=w;
	head[u]=cnt;
	return;
}

int n,m;
double dis1[N];
double dis2[N];
int vis[N];
inline void dijkstra(int s){
	for(int i=1;i<=n;i++){
		dis1[i]=dis2[i]=inf;
	}
	priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > > q;
	q.push(make_pair(0,s));
	dis1[s]=0;
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=edge[i].next){
			int v=edge[i].v;
			double w=edge[i].w;
			if(dis1[v]>dis1[u]+w){
				dis2[v]=dis1[v];
				dis1[v]=dis1[u]+w;
				if(!vis[v])
				q.push(make_pair(dis1[v],v));
			}else if(dis2[v]>dis1[u]+w){
				dis2[v]=dis1[u]+w;
				if(!vis[v])
				q.push(make_pair(dis1[v],v));
			}
			if(dis2[v]>dis2[u]+w){
				dis2[v]=dis2[u]+w;
			}
		}
	}
	return ;
}
struct big_mouse{
	int x,y;
}node[N];
inline double solve(int a,int b){
	double x1=node[a].x;
	double y1=node[a].y;
	double x2=node[b].x;
	double y2=node[b].y;
	double w=sqrt(pow(abs(x1-x2),2)+pow(abs(y1-y2),2));
	return w;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		node[i].x=read(),node[i].y=read();
	}
	for(int i=1;i<=m;i++){
		int u,v;
		u=read(),v=read();
		double w=solve(u,v);
		add(u,v,w);
		add(v,u,w);
	}
	dijkstra(1);
	if(dis2[n]==inf){
		cout<<-1;
		return 0;
	}
	printf("%0.2lf",dis2[n]);
	
	
	
	
	return 0;
}
2025/1/10 19:51
加载中...