生成树模板 90分 求助 谢谢大佬
查看原帖
生成树模板 90分 求助 谢谢大佬
450893
yangyuanxi44楼主2021/11/16 22:25

90分……

不知道那错了,谢谢大佬指点

#9 WA了

提交记录

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,c,k,fa[1000005];
struct node{
	int u,v,w;
}edge[1000005];
struct x{
	int x,y;
}pos[1000005];
int find(int k1){
	if(k1!=fa[k1])
	   return fa[k1]=find(fa[k1]);
	return fa[k1];
}
bool cmp(node x,node y){
	return  x.w<y.w;
}
signed main(){
	cin>>n>>c;
	for(int i=1 ; i<=n ; i++){
		cin>>pos[i].x>>pos[i].y;
		fa[i]=i;
	}
	    
	for(int i=1 ; i<=n ; i++)
	    for(int j=i+1 ; j<=n ; j++){
	    	int dis=(int)pow(pos[i].x-pos[j].x,2)+(int)pow(pos[i].y-pos[j].y,2);
	    	if(dis>=c){
	    		k++;
	    		edge[k].u=i,edge[k].v=j,edge[k].w=dis;
			}   
		}// 计算每个点距离,加边 
	sort(edge+1,edge+k+1,cmp);
	int cnt=0,ans=0;
	for(int i=1 ; i<=k ; i++){
		int cu=find(edge[i].u),cv=find(edge[i].v);
		if(cu!=cv){
			fa[cu]=cv;
			ans+=edge[i].w;
			cnt++;
		}
		if(cnt==n-1)
		   break;
    }//kruskal
	if(cnt!=n-1){
	   cout<<-1;
	   return 0;	
	}//判断联通 
	cout<<ans;
	return 0;       
}
2021/11/16 22:25
加载中...