### 最多k条边
所以要判断是否连接边数过多
(百给小剧场)
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k;
struct tz
{
int from,to,value;
}l[100005];
bool cmp(tz a,tz b)
{
return a.value>b.value;
}
int p[100005];
int f(int x)
{
if(p[x]!=x)
{
return f(p[x]);
}
else
{
return p[x];
}
}
long long k()
{
long long ans = 0;
for(int i = 1;i<=m;i++)
{
int a = f(l[i].from),b = f(l[i].to);
if(a!=b)
{
ans+=l[i].value;
p[a] = b;
}
}
return ans;
}
int main()
{
cin>>n>>m>>k;
for(int i = 1;i<=n;i++)
{
p[i] = i;
}
for(int i = 1;i<=m;i++)
{
cin>>l[i].from>>l[i].to>>l[i].value;
}
sort(l+1,l+1+m,cmp);
cout<<k();
}
result like this
(实际上加个判断连接点数>k直接停掉的变量就可A)
即:在k()中加一个变量,初始1连一条边加一,大于k时break
输出ans
笔记:生成树+判断
最后 A了