并查集做法20分RE求助
查看原帖
并查集做法20分RE求助
321068
安舒阳楼主2022/10/13 20:45

RT,十分感谢

https://www.luogu.com.cn/record/89737058

#include<bits/stdc++.h>
using namespace std;
struct Node{
	int len,a,b;
}data[1000005];
int fa[100005];
bool cmp(Node a,Node b){
	if(a.len>b.len){
		return 0;
	}
	return 1;
}
int find(int a){
	if(fa[a]==a){
		return a;
	}
	return fa[a]=find(fa[a]);
}
void he(int a,int b){
	fa[a]=find(b);
	return ;
}
int main(){
	int n;
	scanf("%d",&n);
	
	int k=0;
	for(int i=1;i<=n;i++){
		fa[i]=i;
		for(int j=1;j<=n;j++){
			if(i==j||j>i){
				int ttmp;
				scanf("%d",&ttmp);
				continue ;
			}
			scanf("%d",&data[k].len);
			data[k].a=i;
			data[k++].b=j;
		}
	}
	
	sort(data,data+k,cmp);
	
	long long ans=0;
	int cnt=0;
	for(int i=0;i<k;i++){
//		printf("%d %d\n",i,data[i].len);
		if(find(data[i].a)!=find(data[i].b)){
			he(data[i].a,data[i].b);
			ans+=data[i].len;
			cnt++;
		}
		if(cnt==n){
			break;
		}
	}
	
	printf("%lld",ans);
	return 0;
}
2022/10/13 20:45
加载中...