大佬求助,为啥代码无法实现QAQ
查看原帖
大佬求助,为啥代码无法实现QAQ
682932
SaltRivers楼主2022/4/6 22:38

附上

#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;
}
2022/4/6 22:38
加载中...