题解 | 旅游

旅游

https://www.nowcoder.com/practice/70f173646f0a4d8daa0eac8a789e906e

#include <bits/stdc++.h>
typedef long long ll;
const int N = 2e5+10;
using namespace std;
struct Node
{
    int u,v;
    ll w;
}e[N];

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

ll n,m,c;
int fa[N];
int find(int x)
{
    return fa[x]==x?x:fa[x]=find(fa[x]);
}



int main()
{   
    cin>>n>>m>>c;
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        ll w;
        cin>>u>>v>>w;
        e[i].u=u;
        e[i].v=v;
        e[i].w=w;
    }

    sort(e+1,e+1+m,cmp);
    vector<int>ed;
    for(int i=1;i<=m;i++)
    {
        int fau = find(e[i].u);
        int fav = find(e[i].v);
        if(fau!=fav)
        {
            fa[fau]=fav;
            ed.push_back(e[i].w);
        }
    }

    sort(ed.begin(),ed.end());
    reverse(ed.begin(),ed.end());
    ll rest = c;
    int cnt = 0;
    int sz = ed.size();
    for(int i=0;i<sz;i++)
    {
        if(rest>=(i+1)*ed[i])
        {
            rest -= (i+1)*ed[i];
            cnt++;
        }
        else break;
    }
    
    if(cnt==sz)cout<<0<<endl;
    else cout<<ed[cnt]<<endl;

    
    

    return 0;
}

思路:利用最小生成树,获取最少所需要的建图成本,接下来利用贪心策略,从最大的建边成本开始减,保证总成本最低

全部评论
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz orz
点赞 回复 分享
发布于 11-19 13:44 山西

相关推荐

点赞 评论 收藏
分享
12-06 16:17
济宁学院 Java
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务