50分求调
查看原帖
50分求调
1144204
_717270楼主2024/4/23 21:44
#include<bits/stdc++.h>
using namespace std;
int A,B,s[310],n,ww[310];
struct qq{
	int u,v,w;
}a[90010];
bool cmp(qq x,qq y){
	return x.w<y.w;
}
int find(int x){//并查集找根节点 
	if(x!=s[x])s[x]=find(s[x]);
	return s[x];
}
int k=1,ans=0;
void work()
{
	for(int i=1;i<=n;++i)s[i]=i;
	for(int i=1;i<=k;++i){
		int x=find(a[i].u),y=find(a[i].v);
		if(x!=y){
			if(a[a[i].u].w>ww[x]+ww[x])continue;//如果连通的代价> 在两个农场挖井的代价就不连通 
			if(ww[x]>ww[y])
				s[x]=y;
			else s[y]=x;//将一个集合中挖井代价最小的农场当做当做根结点 
			ans+=a[i].w;
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)cin>>ww[i];
	
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j){
			int w;
			cin>>w;
			if(i>=j)continue;
			else {
			a[k].w=w;
			a[k].u=i;
			a[k].v=j;
			}
			k++;
		}
	k--;
	sort(a+1,a+1+k,cmp);
	work();
	for(int i=1;i<=n;++i){
		if(s[i]==i)ans+=ww[i];//将每一个根节点的代价累加 
	}
	cout<<ans;
}

2024/4/23 21:44
加载中...