比赛 20190521热身赛 评测结果 AAAAAAAAAA
题目名称 挖水井 最终得分 100
用户昵称 ziiidan 运行时间 0.134 s
代码语言 C++ 内存使用 14.69 MiB
提交时间 2019-05-21 19:20:05
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int maxn=90010;

struct Edge{
	int x,y,val;
}e[maxn];

int n,temp;
int cnt,ans;
int fa[305];

void add(int x,int y,int w)
{
	e[++cnt].x=x;
	e[cnt].y=y;
	e[cnt].val=w;
}

bool cmp(Edge x,Edge y)
{
	return x.val<y.val;
}

int get(int x)
{
	if(fa[x]!=x) fa[x]=get(fa[x]);
	return fa[x];
}

void kruskal()
{
	int num=0;
	for(register int i=1;i<=n;i++) fa[i]=i;
	sort(e+1,e+cnt+1,cmp);
	for(register int i=1;i<=cnt;i++)
	{
		int x=get(e[i].x),y=get(e[i].y);
		if(x==y) continue;
		fa[x]=y;
		num++;
		ans+=e[i].val;
		if(num==n) break;
	}
}

int main()
{
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	scanf("%d",&n);
	for(register int i=1;i<=n;i++)
	{
		scanf("%d",&temp);
		add(0,i,temp);
		//add(i,0,temp);
	}
	for(register int i=1;i<=n;i++)
	  for(register int j=1;j<=n;j++)
	  {
	  	scanf("%d",&temp);
	  	if(i==j) continue;
	  	add(i,j,temp);
	  }
	kruskal();
	printf("%d\n",ans);
	return 0;;
}