我的想法是每次去掉一个边权最小的叶子节点的边,39分,不知道为什么错,求大佬提点。
#include<bits/stdc++.h>
using namespace std;
const int N=103;
struct road
{
int to,w;
road(int x,int y){
to=x;w=y;}
bool operator<(const road&a)const{
return w>a.w;}
};
priority_queue<road> qu;
int r[N][N],p[N],s[N],n;
bool pd[N];
void dfs(int x)
{
pd[x]=1;
for(int i=1;i<=n;i++)
{
if(r[x][i]&&!pd[i])
{
s[x]++;
p[i]=x;
dfs(i);
}
}
}
int main()
{
int q,x,y,z;
long long ans=0;
cin>>n>>q;
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
ans+=z;
r[x][y]=r[y][x]=z;
}
dfs(1);
for(int i=1;i<=n;i++)
if(!s[i]) qu.push(road(p[i],r[p[i]][i]));
int sum=n-1;
while(sum>q)
{
road k=qu.top();
qu.pop();
sum--;
ans-=k.w;
if(!(--s[k.to])) qu.push(road(p[k.to],r[k.to][p[k.to]]));
}
cout<<ans;
return 0;
}