牛客国庆集训派对Day1(最短路作图)优先队列

https://ac.nowcoder.com/acm/contest/201/L

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#define maxn 1200
#define inf 9999999
using namespace std;
typedef pair<double,int>P;
double a,b,c1,c2;
int n;
struct node{
	double x;
	double y;
	double r;
}ac[maxn];
double M[maxn][maxn];
double dist[maxn];
int vist[maxn];
void init(){
	for(int i=0;i<=n+1;i++){
		for(int j=0;j<=n+1;j++){
			M[i][j]=inf;
		}
		M[i][i]=0;
	}
}
 
void dijstra(){
	fill(dist, dist + 1003, 1e18);
	priority_queue<P,vector<P>,greater<P> >q;
	dist[0]=0;
	q.push(P(0,0));
	while(!q.empty()){
		P u=q.top();
		q.pop();
		int x=u.second;
		if(u.first>dist[x])
		continue;
		for(int i=0;i<=n+1;i++){
			if(M[x][i]+dist[x]<dist[i]){
				dist[i]=M[x][i]+dist[x];
				q.push(P(dist[i],i));
			}
		}
	}
} 
/*
void dijstra(){
	for(int i=0;i<=n+1;i++){
		dist[i]=M[i][0];
	}
//		for(int i=0;i<=n+1;i++)
//	{
//		printf("dis[%d] = %.3lf\n",i,dist[i]);
//	}
	memset(vist,0,sizeof(vist));
	dist[0]=0;
	vist[0]=1;
	for(int i=1;i<=n+1;i++){
		int v=-1,maxx=999999999;
		for(int j=0;j<=n+1;j++){
			if(!vist[j]&&dist[j]<=maxx){
				maxx=dist[j];
				v=j;
			}
		}
		if(v==-1) return ;
		vist[v]=1;
	//	printf("%d\n",v);
		for(int k=1;k<=n+1;k++){
			if(!vist[k]&&dist[v]+M[v][k]<=dist[k]){ 
				dist[k]=dist[v]+M[v][k];
				//printf("asdfasdf\n");
				//vist[k]=1;
			}
		}
	}

}*/
int main(){
	double dis1,dis2,dis3;
	cin>>n>>a>>b>>c1>>c2;
init();
	for(int i=1;i<=n;i++){
		cin>>ac[i].x>>ac[i].y>>ac[i].r;
		
		 dis1=fabs(a*ac[i].x+b*ac[i].y+c1)/sqrt(a*a+b*b);
		M[0][i]=M[i][0]=dis1<=ac[i].r?0:(dis1-ac[i].r);
		
		
		 dis2=fabs(a*ac[i].x+b*ac[i].y+c2)/sqrt(a*a+b*b);
		M[i][n+1]=M[n+1][i]=dis2<=ac[i].r?0:(dis2-ac[i].r);
		
		//cout<<fabs(a*ac[i].x+b*ac[i].                                                                                              y+c1)*1.0/sqrt(a*a+b*b)<<" "<<fabs(a*ac[i].x+b*ac[i].y+c2)/sqrt(a*a+b*b)<<endl;
	}
	M[0][n+1]=M[n+1][0]=fabs(c1-c2)/sqrt(a*a+b*b);
	for(int i=1;i<n;i++){
		for(int j=i+1;j<=n;j++){
			 dis3=sqrt((ac[j].x-ac[i].x)*(ac[j].x-ac[i].x)+(ac[j].y-ac[i].y)*(ac[j].y-ac[i].y));
			M[i][j]=M[j][i]=dis3<=(ac[i].r+ac[j].r)?0:(dis3-(ac[i].r+ac[j].r));
		}
	}
	dijstra();
	printf("%.6lf\n",dist[n+1]);
//	cout<<dist[n+1]<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值