题意 给出每两个点之间的关系以及连接的代价,把这些点分成 k 对找出最小代价。
输入
3 1 2
1 2 1
输出
1
思路 把这些代价以及哪两个点存储在结构体数组里,再从小到大进行排序,合并,直到剩下 k 个。
代码
#include<iostream>
using namespace std;
#include<cstring>
#include<algorithm>
const int N=100005;
int op[N];
int pre[N];
struct node
{
int a,b;
int as;
}p[N];
int cmp(node a,node b)
{
return a.as<b.as;
}
int find(int x)
{
if(x==pre[x])return x;
return pre[x]=find(pre[x]);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int ans=0;
int re=0;
int ant=0;
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>op[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>re;
if(i<j)
{
p[++ant].b=j;
p[ant].a=i;
p[ant].as=re+op[i]+op[j];
}
}
}
sort(p+1,p+1+ant,cmp);
for(int i=1;i<=n;i++)pre[i]=i;
for(int i=1;i<=ant;i++)
{
int a=find(p[i].a);
int b=find(p[i].b);
if(a!=b)
{
pre[a]=b;
ans+=p[i].as;
}
}
cout<<ans<<endl;
memset(op,0,sizeof op);
memset(pre,0,sizeof pre);
memset(p,0,sizeof p);
}
return 0;
}