20分求查错(带注释)
查看原帖
20分求查错(带注释)
173397
取啥名好楼主2020/8/18 12:44
#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)/2)
int n,m,jl,cnt=0,bel[100000]={0};
double l=0.0,r,ans,dist[1010][1010]={0};
struct node{int x,y;}ta[1000];
bool cmp(node a,node b){return a.x<b.x;}
int find (int x){if(bel[x]!=x)bel[x]=find(bel[x]);return bel[x];}
void join(int x,int y){bel[find(x)]=find(y);}
bool check(double dis){ 
    for(int i=1;i<=m;i++)bel[i]=i;
    for(int i=1;i<=m;i++)for(int j=1;j<=m;j++){
        if(0.0001<dis-dist[i][j])join(i,j);//如果能连上就放一起(用并查集)
    }if(find(1)!=find(m))return 0;return 1;//如果第一个跟最后一个联不通就不行,不然就行
}
int main(){
    cin>>n>>m;for(int i=1;i<=m;i++)cin>>ta[i].x>>ta[i].y;
    sort(ta+1,ta+1+m,cmp);//先按x值排序方便后面计算
    l=ta[1].x;r=1000000.0;if(n-ta[m].x>l)l=n-ta[m].x;l*=1.0;//保证0和n可以到
    for(int i=1;i<=m;i++)for(int j=1;j<=m;j++){
        if(i==j)continue;dist[i][j]=sqrt((ta[i].x-ta[j].x)*(ta[i].x-ta[j].x)+(ta[i].y-ta[j].y)*(ta[i].y-ta[j].y));
    }//预处理各边距离
    while(0.0001<r-l){if(check(mid*2)){r=mid;ans=r;} else l=mid;}
    cout<<fixed<<setprecision(2)<<ans;
    system("pause");
}
2020/8/18 12:44
加载中...