//最小生成树
#include <iostream>
using namespace std;
int prim();
int v;
int e;
int g[505][505];
int min_v;
int main()
{
int T;
cin >> T;
while(T--)
{
cin >> v >>e;
for(int i = 0; i <= v; i++)
for(int j = 0; j <= v; j++)
g[i][j] = 1 << 30;
for(int i = 1; i <= e; i++)
{
int a, b;
cin >> a >> b;
cin >> g[a][b];
g[b][a] = g[a][b];
}
min_v = 1 << 30;
for(int i = 1; i <= v; i++)
{
int t;
cin >> t;
min_v = min_v < t ? min_v : t;
}
cout << (prim() + min_v) << '\n';
}
}
int prim()
{
int lowcost[505] = {0};
int nearvex[505] = {0};
nearvex[1] = -1;
for(int i = 2; i <= v; i++)
lowcost[i] = g[1][i];
for(int i = 2; i <= v; i++)
{
int min_cost = 1 << 30;
int sit;
for(int j = 1; j <= v; j++)
if(nearvex[j] != -1 && lowcost[j] < min_cost)
{
min_cost = lowcost[j];
sit = j;
}
nearvex[sit] = -1;
for(int i = 1; i <= v; i++)
{
if(g[sit][i] < lowcost[i] && nearvex[i] != -1)
{
lowcost[i] = g[sit][i];
nearvex[i] = sit;
}
}
}
int sum = 0;
for(int i = 1; i <= v; i++)
sum += lowcost[i];
return sum;
}
南阳理工OJ_题目38 布线问题
最新推荐文章于 2022-01-22 21:49:04 发布