题目大意
链接
给出
n
n
n个点,其中一个点
i
i
i与另一个点
j
j
j之间有一条边权为
g
i
,
j
g_{i,j}
gi,j的边,每一个点
i
i
i与点
m
m
m之间有一条边权为
m
i
m_i
mi的边。求让所有点连通的最小代价。
解题思路
最小生成树,把题目中每个间谍参加拯救世界任务看成将他们连到一个虚点 M M M,再对 1 1 1~ i i i的点和 M M M求最小生成树
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int w,x,y;
}a[505005];
int n,p[1005],tot,ans;
bool cmp(node x,node y)
{
return x.w<y.w;
}
int find(int x)
{
if(p[x]==x) return x;
return p[x]=find(p[x]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int x;
cin>>x;
if(i<j)
{
a[++tot].w=x;
a[tot].x=i;
a[tot].y=j;
}
}
p[i]=i;
}
p[n+1]=n+1;
for(int i=1;i<=n;i++)
{
tot++;
cin>>a[tot].w;
a[tot].x=i;
a[tot].y=n+1;
}
sort(a+1,a+tot+1,cmp);
for(int i=1;i<=tot;i++)
{
int w=a[i].w,x=a[i].x,y=a[i].y;
if(find(x)==find(y)) continue;
ans+=w;
p[find(x)]=p[find(y)];
}
cout<<ans;
return 0;
}