附上
#include<bits/stdc++.h>
using namespace std;
const int N=850;
const int M=2*N*N;
int n,m,id,head[N],h[N],tot;
double dx[N],dy[N],dis[N],dis1[M],distance;
struct edge{
int to,next;
double weight;
}e[M];
priority_queue<pair<double,int>,vector<pair<double,int> >,greater<pair<double,int> > > q;
void add(int x,int y,double z)//加边
{
e[++id].to=y;
e[id].weight=z;
e[id].next=head[x];
head[x]=id;
}
double dist(int i,int j){return sqrt((dx[i]-dx[j])*(dx[i]-dx[j])+(dy[i]-dy[j])*(dy[i]-dy[j]));}//计算两点间距离
bool judge(double x)//标准dijskra最短路
{
memset(dis,-1,sizeof(dis));
dis[m+1]=0;
q.push(make_pair(dis[m+1],m+1));
while(q.size())
{
int x=q.top().second;
double t=q.top().first;
q.pop();
if(t!=dis[x]) continue;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;double z=e[i].weight;
if(z>x) continue;
if(dis[y]>max(dis[x],z)||dis[y]==-1)
{
dis[y]=max(dis[x],z);
q.push(make_pair(-dis[y],y));
}
}
}
return dis[m+2]!=-1;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%lf%lf",&dx[i],&dy[i]);
//加边(灯塔距离海滩边缘的距离)
add(m+1,i,dx[i]);add(i,m+1,dx[i]);
add(m+2,i,double(n)-dx[i]),add(i,m+2,double(n)-dx[i]);
dis1[++tot]=dx[i],dis1[++tot]=double(n)-dx[i];
}
for(int i=1;i<m;i++)
for(int j=i+1;j<=m;j++){
add(i,j,dist(i,j)/2.0),add(j,i,dist(i,j)/2.0);//信号塔之间加边(注意长度为距离的1/2)
dis1[++tot]=dist(i,j)/2.0;
}
sort(dis1+1,dis1+1+tot);
int l=1,r=tot;
while(l<=r){
int mid=(l+r)>>1;
if(judge(dis1[mid])) r=r-1;
else l=mid+1;
}
printf("%.2lf",dis1[l]);//另一边为终点
return 0;
}