生成树 口袋的天空

这么水的题,复习的时候居然没有立刻想出来。
题意:给出一张图的关系, n n 个点,m条边,问能否分成k个联通块,求最小边权和。

最小边权和,意味着每一个联通块都是一棵树,考虑最小生成树的过程,边权从小到大排序,一开始有 n n 个联通块,每一次合并减少一个联通块,当联通块数量=k break b r e a k 。所有边枚举完后如果联通块数 >k > k ,就无法分成 k k <script type="math/tex" id="MathJax-Element-91">k</script>个联通块。

#include<bits/stdc++.h>
using namespace std;
int n,m,k,f[1001000],num,ans;
struct node
{
    int x,y,c;
}e[1001000];
int find(int x)
{
    if(x==f[x])
        return x;
    else
    {
        f[x]=find(f[x]);
        return f[x];
    }
}
bool cmp(node n1,node n2)
{
    return n1.c<n2.c;
}
int main()
{
    cin>>n>>m>>k;
    num=n;
    for(int i=1;i<=m;++i)
        scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].c);
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=n;++i)
        f[i]=i;
    for(int i=1;i<=m;++i)
    {
        if(num==k)
            break;
        int fx=find(e[i].x);
        int fy=find(e[i].y);
        if(fx!=fy)
        {
            ans+=e[i].c;
            num--;
            f[fx]=fy;
        }
    }
    if(num!=k)
        cout<<"No Answer";
    else
        cout<<ans;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值