40求助(玄关)
查看原帖
40求助(玄关)
1139975
封禁用户楼主2024/12/5 20:29

RT,40分。代码如下:

#include<bits/stdc++.h>
using namespace std;
const int ma=1000005;
int n,m,f[ma];
struct node
{
    int u,v;
    double w;
}a[ma];
bool cmp(const node a,const node b)
{
    return a.w<b.w;
}
int sfind(int q)
{
    if(f[q]==q)return q;
    else 
    {
        f[q]=sfind(f[q]);
        return f[q];
    }
}
bool merge(int x,int y)
{
    int t1=sfind(x);
    int t2=sfind(y);
    if(t1!=t2)
    {
        f[t1]=t2;return true;
    }
    return false;
}
int main()
{
    int i,j,k=0;
    double x[ma],y[ma];
    cin>>n>>m;
    for(i=1;i<=m;i++)
	{
		f[i]=i;
	}
    for(i=1;i<=m;i++)
    {
        cin>>x[i]>>y[i];
    }
    for(i=1;i<=m;i++)
        for(j=1;j<=m;j++)
        {
            k++;
            a[k].u=i;a[k].v=j;
            a[k].w=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
        }
    sort(a+1,a+k+1,cmp);
    int count=0;
    double ans;
    for(i=1;i<=k;i++)
    {
        if(merge(a[i].u,a[i].v))
        {
            count++;if(count>n)break;ans=a[i].w;
        }
    }
    cout<<fixed<<setprecision(2)<<ans<<endl;
    
    return 0;
}
2024/12/5 20:29
加载中...