本题是一道最小生成树的kruskal算法的题目

先用kruskal算法去记录最小生成树的最短边

然后根据题意所给出的要求去进行迭代更新sum,直至找到一个sum值大于牛牛所投入的资金c,输出最后令 sum>=c的损害值

#include<iostream>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;

const int N=1e5+10;
int p[N];
vector<int> u;
int n,m,c;
int cnt;

struct node{
    int a;int b;int w;
}edge[N];

bool cmp(node a,node b)
{
    return a.w<b.w;
}

int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}

void kruskal()
{
    for(int i=0;i<m;i++)
    {
        int pa=find(edge[i].a);
        int pb=find(edge[i].b);
        int w=edge[i].w;
        
        if(pa!=pb)
        {
            p[pa]=pb;
            cnt++;
            u.push_back(w);
        }
    }
}

signed main()
{
    cin>>n>>m>>c;
    
    
    for(int i=0;i<n;i++) p[i]=i;
    
    for(int i=0;i<m;i++)
    {
        int a,b,w;
        cin>>a>>b>>w;
        edge[i]={a,b,w};
    }
    
    sort(edge,edge+m,cmp);
    
    kruskal();
    
    int k=1;
    int sum=0;
    for(int i=u.size()-1;i>=0;i--)//此处开始对sum进行迭代操作,找出大于c的sum的临界条件
    {
        sum+=u[i]*(k++);
        if(sum>c) {
            printf("%lld",u[i]);
            return 0;
        }
    }
    printf("0");
}