re3个79分,求调,悬棺
  • 板块P1194 买礼物
  • 楼主Em0ty
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/18 10:07
  • 上次更新2024/10/18 15:12:17
查看原帖
re3个79分,求调,悬棺
1052499
Em0ty楼主2024/10/18 10:07
#include<bits/stdc++.h>
using namespace std;
struct edge{
	int u,v,k;
}e[2010];
int a,b,cnt;
int f[2010];
inline int find(int x){
	if(x==f[x]) return x;
	return f[x]=find(f[x]);
}
inline bool cmp(edge x,edge y){
	return x.k<y.k;
}
int main(){
	scanf("%d%d",&a,&b);
	for(int i=1;i<=b;i++){
		for(int j=1;j<=b;j++){
			int x;
			scanf("%d",&x);
			if(j>i){
				if(x==0||x>a){
					continue;
				}
				else{
					e[++cnt].u=i;
					e[cnt].v=j;
					e[cnt].k=x;
				}
			}
		}
	}
	sort(e+1,e+1+cnt,cmp);
	for(int i=1;i<=b;i++){
		f[i]=i;
	}
	int nd=0;
	int i=1;
	int ans=0;
	for(int i=1;i<=cnt;i++){
		int l=find(e[i].u),r=find(e[i].v);
		if(l==r){
			continue;
		}
		ans+=e[i].k;
		f[l]=find(f[r]);
		nd++;
	}
	if(nd<b) ans+=(b-nd)*a;
	printf("%d",ans);
	return 0;
}

2024/10/18 10:07
加载中...