题目链接:here~~
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <string.h>
using namespace std;
struct ue
{
int x, y, w;
bool operator < (ue a)const
{
return w>a.w;
}
};
priority_queue<ue> p;
int f[101];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
int N, n, m, i, j;
ue a, b;
// freopen("in.txt", "r", stdin);
cin>>N;
while (N--)
{
while (!p.empty()) p.pop();
for (i=0;i<101;i++) f[i]=i;
cin>>n>>m;
for (i=0; i<n; i++)
{
cin>>a.x>>a.y>>a.w;
if (a.x==a.y) continue;
p.push(a);
}
if (n<m-1) {printf("No solution\n");continue;}
int k=1, res=0;
while (k<m)
{
b=p.top();
int c=find(b.x), d=find(b.y);//找到b.x的根和b.y的根
if (c!=d){res+=b.w;f[b.y]=b.x;}//如果不相等,说明两个点不属于同一个连通,所以加上这条边的权值,并让两个点相连
p.pop();//删除当前操作的边
k++;//找到m-1个边后跳出循环,m-1是最少需要的边数
}
cout<<res<<endl;
}
return 0;
}