题目链接:[kuangbin带你飞]专题六 最小生成树 E - QS Network
//#include"stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
struct edge{
int s, e, w;
};
edge e[200009];
int p[10009], cost[10009];
bool cmp(edge a, edge b){ return a.w < b.w; }
int find(int x){ return p[x] == x ? x : p[x] = find(p[x]); }
void kruscal(int n, int cnt)
{
int ans = 0;
int flag = 0;
for (int i = 0; i <= n; i++) p[i] = i;
sort(e, e + cnt, cmp);
for (int i = 0; i < cnt; i++)
{
int x = find(e[i].s);
int y = find(e[i].e);
if (x != y)
{
p[x] = y;
ans += e[i].w;
flag++;
}
if (flag == n-1) break;
}
cout << ans << endl;
}
int main()
{
int m;
cin >> m;
while (m--)
{
int n, w, cnt = 0;
cin >> n;
for (int i = 0; i < n; i++) cin >> cost[i];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
cin >> w;
if (i < j)
{
e[cnt].s = i, e[cnt].e = j, e[cnt++].w = w + cost[i] + cost[j];
}
}
kruscal(n, cnt);
}
return 0;
}