Kruskal 30pts求助
查看原帖
Kruskal 30pts求助
546681
lcbridgeAK CSP-S楼主2023/2/1 11:43

RT,样例二未过,谢谢

#include <bits/stdc++.h>
using namespace std;
int n,k,fa[1005],cnt;
struct pos{
	int x,y;
}a[1005];
struct edge{
	int u,v; 
	double w;
}e[10000005];
double dis(int x,int y){
	return sqrt((a[x].x-a[y].x)*(a[x].x-a[y].x)+(a[x].y-a[y].y)*(a[x].y-a[y].y));
}
bool cmp(edge x,edge y){
	return x.w<y.w;
}
int find(int x){
	if(x==fa[x])return x;
	return fa[x]=find(fa[x]);
}
void kruskal(){
	int tmp=0;
	sort(e+1,e+cnt+1,cmp);     
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=cnt;i++){     
		int fu=find(e[i].u);
		int fv=find(e[i].v);    
		cout<<fu<<' '<<fv<<endl;
		if(fu!=fv){
			fa[fv]=fu;
			tmp++;
		}  
		if(tmp==k){
			printf("%.2lf",e[i].w);
			break;
		}
	} 
}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);	
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(i!=j){
				e[++cnt].u=i;
				e[cnt].v=j;
				e[cnt].w=dis(i,j);
			}
		}
	}                              
	kruskal();
	return 0;
}
2023/2/1 11:43
加载中...