宇宙射线求调
查看原帖
宇宙射线求调
541069
SuperCowHorse楼主2022/10/16 09:51

RT。用的 dijkstra 最短路。

//chenye3
#include<bits/stdc++.h>
#define ll long long
#define do double
#define re register
using namespace std;
struct node{
	int pos;do dis;
	bool operator <(const node &tmp)const{return tmp.dis<dis;}
};
const int maxm=1e6+5,maxn=1010;
int sx,sy,ex,ey;
int n;
struct point{
	int x,y,z;
}a[maxn];
struct edge{
	int v;do w;int next;
}e[maxm<<1];int head[maxn],cnt;
inline void add(int u,int v,do w){
	e[++cnt]=edge{v,w,head[u]};
	head[u]=cnt;
}
inline int sqr(int x){return x*x;}
inline do get(point x,point y){return sqrt(sqr(x.x-y.x)+sqr(x.y-y.y));}
do dis[maxn];bool vis[maxn];
inline void dijkstra(int s){
	priority_queue<node>q;
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	q.push(node{s,0});dis[s]=0.0;
	while(!q.empty()){
		node tmp=q.top();q.pop();
		int u=tmp.pos;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].v;
			if(dis[v]>dis[u]+e[i].w){
				dis[v]=dis[u]+e[i].w;
				if(!vis[v]) q.push(node{v,dis[v]});
			}
		}
	}
}
signed main(){
	scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
	scanf("%d",&n);
	a[1]=point{sx,sy,0};
	for(int i=2;i<=n+1;++i)
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
	n+=2;
	a[n]=point{ex,ey,0};
	for(int i=1;i<=n;++i)
		for(int j=1;j<i;++j){
			add(i,j,max(0.0,get(a[i],a[j])-(a[i].z+a[j].z)));
			add(j,i,max(0.0,get(a[i],a[j])-(a[i].z+a[j].z)));
		}
	dijkstra(1);
	printf("%.10lf",dis[n]);
	return 0;
}
2022/10/16 09:51
加载中...