#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;
}
思路:利用最小生成树,获取最少所需要的建图成本,接下来利用贪心策略,从最大的建边成本开始减,保证总成本最低

京公网安备 11010502036488号