最小生成树求助
查看原帖
最小生成树求助
430409
Coros_Trusds楼主2021/12/11 17:40
//2021/12/11

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <cstdio>

#include <climits>//need "INT_MAX","INT_MIN"

#include <cstring>//need "memset"

#include <cmath>

#include <algorithm>

#define enter() putchar(10)

#define debug(c,que) cerr<<#c<<" = "<<c<<que

#define cek(c) puts(c)

#define blow(arr,st,ed,w) for(register int i=(st);i<=(ed);i++)cout<<arr[i]<<w;

#define speed_up() cin.tie(0),cout.tie(0)

#define endl "\n"

#define Input_Int(n,a) for(register int i=1;i<=n;i++)scanf("%d",a+i);

#define Input_Long(n,a) for(register long long i=1;i<=n;i++)scanf("%lld",a+i);

#define mst(a,k) memset(a,k,sizeof(a))

namespace Newstd
{
	inline int read()
	{
		int x=0,k=1;
		char ch=getchar();
		while(ch<'0' || ch>'9')
		{
			if(ch=='-')
			{
				k=-1;
			}
			ch=getchar();
		}
		while(ch>='0' && ch<='9')
		{
			x=(x<<1)+(x<<3)+ch-'0';
			ch=getchar();
		}
		return x*k;
	}
	inline void write(int x)
	{
		if(x<0)
		{
			putchar('-');
			x=-x;
		}
		if(x>9)
		{
			write(x/10);
		}
		putchar(x%10+'0');
	}
}

using namespace Newstd;

using namespace std;

const int ma=1005;

struct Node
{
	int x;
	
	int y;
	
	double dis;
};

Node node[ma*ma],tr[ma*ma];

int fa[ma];

int n,k;

int idx;

inline double dist(int a,int b)
{
	return sqrt(pow((node[a].x-node[b].x),2)+pow((node[a].y-node[b].y),2));
}

inline void init()
{
	for(register int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
}

inline int getf(int x)
{
	if(fa[x]==x)
	{
		return x;
	}
	
	return fa[x]=getf(fa[x]);
}

inline void merge(int x,int y)
{
	int f1=getf(x),f2=getf(y);
	
	if(f1!=f2)
	{
		fa[f1]=f2;
	}
}

inline void Kruskal()
{
	int sum=0;
	
	for(register int i=1;i<=idx;i++)
	{
		if(sum==n-k)
		{
			printf("%.2lf\n",tr[i].dis);
			
			return;
		}
		
		if(getf(tr[i].x)!=getf(tr[i].y))
		{
			merge(tr[i].x,tr[i].y);
			
			sum++;
		}
	}
}

int main(void)
{
	n=read(),k=read();
	
	for(register int i=1;i<=n;i++)
	{
		node[i].x=read(),node[i].y=read();
	}
	
	for(register int i=1;i<=n;i++)
	{
		for(register int j=1;j<i;j++)
		{
			tr[++idx].x=i,tr[idx].y=j,tr[idx].dis=dist(i,j);
		}
	}
	
	init();
	
	sort(tr+1,tr+idx+1,[](Node x,Node y)mutable
	{
		return x.dis<y.dis;
	});
	
	Kruskal();
	
	return 0;
}
2021/12/11 17:40
加载中...