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

using namespace std;

LL n,tot,fa[1007],head[1007];

inline int read()
{
	register int x=0,w=1,ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*w;
}

struct Edge{
	int x,y,w,nxt;
}edge[1000000];

void add(int x,int y,int w)
{
	edge[++tot].x=x,edge[tot].y=y,edge[tot].w=w;
	edge[tot].nxt=head[x],head[x]=tot;
}

int find(int x)
{
	return x==fa[x]?x:fa[x]=find(fa[x]);
}

bool judge(int x,int y)
{
	return find(x)==find(y)?true:false;
}

void merge(int x,int y)
{
	fa[find(x)]=find(y);
}

bool cmp(Edge a,Edge b)
{
	return a.w<b.w;
}

int main()
{
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	int temp;
	LL sum=0;
	n=read();
	for(int i=1;i<=n;i++){
		temp=read();
		add(0,i,temp);
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			temp=read();
			if(i==j)continue;
			add(i,j,temp);
			add(j,i,temp);
		}
	sort(edge+1,edge+tot+1,cmp);	
	for(int i=0;i<=n;i++)fa[i]=i;
	for(int i=1;i<=tot;i++){
		int x=edge[i].x,y=edge[i].y;
		if(!judge(x,y)){
			merge(x,y);
			sum+=edge[i].w;
		}
	}
	printf("%lld\n",sum);	
	return 0;
}