比赛 20190521热身赛 评测结果 C
题目名称 挖水井 最终得分 0
用户昵称 欧鹰123 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2019-05-21 19:16:57
显示代码纯文本
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int f[50050],n,m,ans,cnt,w[50050],z;
struct node 
{
    int x,y,w;
}a[200100];
bool cmp(node a,node b)
{
    return a.w<b.w;
}
signed find(int x)
{
    if(f[x]==x)return x;
    else return f[x]=find(f[x]);
}
signed main()
{
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
	cin>>w[i];
	a[i].x=n+1,a[i].y=i,a[i].w=w[i];
	}
	z=n;	
	for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
    	int c;
    	cin>>c;
       if(i<j&&c!=0)
	   {
	   	z++;
	   	a[z].x=i,a[z].y=j,a[z].w=c;
	   }
    }
    sort(a+1,a+1+z,cmp);
    for(int i=1;i<=n;i++)f[i]=i;
    for(int i=1;i<=z;i++)
    {
        if(find(a[i].x)!=find(a[i].y))
        {
            ans+=a[i].w;
            f[find(a[i].x)]=find(a[i].y);
            cnt++;
            if(cnt==n)
            {
                cout<<ans;
                return 0;
            }
        }
    }
    return 0;
}