比赛 20190521热身赛 评测结果 AAAAAAAAAA
题目名称 挖水井 最终得分 100
用户昵称 gsj.cpp 运行时间 0.066 s
代码语言 C++ 内存使用 17.12 MiB
提交时间 2019-05-21 19:20:53
显示代码纯文本
#include <algorithm> 
#include <bitset> 
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> 
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque> 
#include <exception>
#include <fstream>
#include <functional> 
#include <limits>
#include <list> 
#include <map> 
#include <iomanip>
#include <ios> 
#include <iosfwd> 
#include <iostream>
#include <istream> 
#include <ostream>
#include <queue> 
#include <set> 
#include <sstream> 
#include <stack> 
#include <stdexcept> 
#include <streambuf> 
#include <string> 
#include <utility> 
#include <vector> 
#include <cwchar>
#include <cwctype>
#define LL long long
using namespace std;
inline LL read()
{
	char ch=getchar();LL x=0,f=1;
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
LL n,w[305],a[305][305],ans=0,sum;
struct Edge
{
	LL from,to,w;
	int num;
}e[90005];
LL cnt,fa[305];
bool cmp(Edge a,Edge b)
{
	return a.w<b.w;
}
LL getfa(LL x)
{
	if(fa[x]==x)return x;
	else return fa[x]=getfa(fa[x]);
}
void u(LL x,LL y)
{
	x=getfa(fa[x]),y=getfa(y);
	fa[x]=y;
}

void kru()
{
	sort(e+1,e+cnt+1,cmp);
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=cnt;i++)
	{
		if(getfa(e[i].from)!=getfa(e[i].to))
		{
			ans+=e[i].w;
			u(e[i].from,e[i].to);
			sum++;
			if(sum==n)return;
		}
	}
	return;
}
int main()
{
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)
	{
		e[++cnt].from=n+1;
		e[cnt].to=i;
		e[cnt].w=read();
	}
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		a[i][j]=read();
		if(i>j)
		{
			e[++cnt].from=i;
			e[cnt].to=j;
			e[cnt].w=a[i][j];
		}
	}
	kru();
	sort(w+1,w+n+1);
	ans+=w[1];
	cout<<ans;
	return 0;
}