mx刚学次短路,70pts
  • 板块P1491 集合位置
  • 楼主kbzcz
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/6/17 16:24
  • 上次更新2023/10/23 12:56:33
查看原帖
mx刚学次短路,70pts
416192
kbzcz楼主2023/6/17 16:24
#include <bits/stdc++.h>
using namespace std;
typedef double DB;
const int N=210,M=N*N,INF=0x3f3f3f3f;
int n,m;
struct node {
	int x,y;
}p[N];
struct node2{
	int x;DB y;
};
bool operator<(node2 a,node2 b) {
	return a.y>b.y;
} 
struct edge{
	int x,y;DB c;int pre;
}a[M];int alen,last[N];
int vis[N];
DB d[N],f[N];
DB dis(node x,node y) {
	return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
void ins(int x,int y) {
	alen++;a[alen]=edge{x,y,dis(p[x],p[y]),last[x]};
	last[x]=alen;
}
void dij(int st) {
	priority_queue<node2> q;
	for(int i=1;i<=n;i++) f[i]=INF;
	q.push({st,0});f[st]=0;
	while(!q.empty()) {
		int x=q.top().x;
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int k=last[x];k;k=a[k].pre) {
			int y=a[k].y;
			if(f[y]>f[x]+a[k].c) {
				f[y]=f[x]+a[k].c;
				q.push({y,f[y]});
			}
		}
	}
}
void astar(int st,int kth) {
	if(f[st]==INF) {
		puts("-1");
		return ;
	}
	priority_queue<node2> q;
	memset(vis,0,sizeof(vis));
	q.push({st,0+f[st]});
	while(!q.empty()) {
		int x=q.top().x;
		DB len=q.top().y-f[x];
		q.pop();
		vis[x]++;
		if(vis[n]==kth) {
			printf("%.2lf",len);
			return ;
		}
		for(int k=last[x];k;k=a[k].pre) {
			int y=a[k].y;
			if(vis[y]<kth) q.push({y,f[y]+len+a[k].c});
		}
	}
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) {
		scanf("%d%d",&p[i].x,&p[i].y);
	}
	for(int i=1;i<=m;i++) {
		int x,y;
		scanf("%d%d",&x,&y);
		ins(x,y);
		ins(y,x);
	}
	dij(n);
	if(f[1]==INF) puts("-1");
	else astar(1,2);
}
2023/6/17 16:24
加载中...