最小生成树

\(T1:\)北极通信网络

只需要在最后计算时把卫星减掉即可,注意:输出最大边长,多测要清空!

//#pragma GCC optimize("O2")
#include<bits/stdc++.h>
using namespace std;
int n,m;
int fa[1000010];
double node[1010][2];
int cnt;
struct eg{
	int l,r;
	double w;
	bool operator <(const eg &W)const{
		return w<W.w;
	}
}a[1000010];
int find_fa(int x){
	if(fa[x]==x){
		return fa[x];
	}
	return fa[x]=find_fa(fa[x]);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int T;
	cin>>T;
	while(T--){
		memset(fa,0,sizeof fa);
		cnt=0;
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			cin>>node[i][0]>>node[i][1];
		}
		for(int i=1;i<=m;i++){
			for(int j=i+1;j<=m;j++){
				a[++cnt].l=i;
				a[cnt].r=j;
				a[cnt].w=sqrt((node[i][0]-node[j][0])*(node[i][0]-node[j][0])+(node[i][1]-node[j][1])*(node[i][1]-node[j][1]));
			}
		}
		sort(a+1,a+cnt+1);
		for(int i=1;i<=m;i++){
			fa[i]=i;
		}
		int tot=0;
		for(int i=1;i<=cnt;i++){
			int fl=find_fa(a[i].l),fr=find_fa(a[i].r);
			if(fl!=fr){
				fa[fl]=fr;
				tot++;
				if(tot==m-n){
					cout<<fixed<<setprecision(2)<<a[i].w<<"\n";
				}
			}
		}
	}
	return 0;
}

\(T2:\)新的开始

把发电站放到0号点上,当超级原点。注意:最后输出要求变成\(tot==n\)而不是\(tot==n-1\)

//#pragma GCC optimize("O2")
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
int fa[100010];
struct node{
	int l,r,w;
	bool operator <(const node &W)const{
		return w<W.w;
	}
}a[100010];
int v[100010];
int find_fa(int x){
	if(fa[x]==x){
		return fa[x];
	}
	return fa[x]=find_fa(fa[x]);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=n;i++){
		cin>>v[i];
		a[++cnt].l=0;
		a[cnt].r=i;
		a[cnt].w=v[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[++cnt].l=i;
			a[cnt].r=j;
			cin>>a[cnt].w;
		}
	}
	sort(a+1,a+cnt+1);
	int ans=0,tot=0;
	for(int i=1;i<=cnt;i++){
		int fl=find_fa(a[i].l),fr=find_fa(a[i].r);
		if(fl!=fr){
			fa[fl]=fr;
			tot++;
			ans+=a[i].w;
		}
		if(tot==n){
			cout<<ans;
			return 0;
		}
	}
	return 0;
}
posted @ 2025-05-13 20:44  lbh123  阅读(18)  评论(0)    收藏  举报