【挖沟——Kruskal】

挖沟


题目描述

胡队长带领HA实验的战士们玩真人CS,真人CS的地图由一些据点组成,现在胡队长已经占领了n个据点,为了方便,将他们编号为1-n,为了隐蔽,胡队长命令战士们在每个据点出挖一个坑,让战士们躲在坑里。由于需要在任意两个点之间传递信息,两个坑之间必须挖出至少一条通路,而挖沟是一件很麻烦的差事,所以胡队长希望挖出数量尽可能少的沟,使得任意两个据点之间有至少一条通路,顺便,尽可能的∑d[i][j]使最小(其中d[i][j]为据点i到j的距离)。


输入描述:

第一行有2个正整数n,m,m表示可供挖的沟数。
接下来m行,每行3个数a,b,v,每行描述一条可供挖的沟,该沟可以使a与b连通,长度为v。

输出描述:

输出一行,一个正整数,表示要使得任意两个据点之间有一条通路,至少需要挖长的沟。(数据保证有解)

示例

示例1:
输入
2 2
1 2 1
1 2 3

输出
1

示例2
输入
3 3
1 2 3
2 3 4
1 3 5

输出
7

备注:
对于100%的测试数据:
1 ≤ n ≤ 100000
1 ≤ m ≤ 500000
1 ≤ v ≤ 10000


AC代码

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=500005;
struct node{
    int a,b,v;
};node point[N];
int n,m,f[N];
bool cmp(node x,node y){
    return x.v<y.v;
}
void init(){
    for(int i=1;i<=n;++i)
        f[i]=i;
}
int find(int x){
    if(x!=f[x])
        f[x]=find(f[x]);
    return f[x];
}
bool mix(int x,int y){
    int f_x=find(x);
    int f_y=find(y);
    if(f_x==f_y)
        return false;
    f[f_x]=f_y;
    return true;
}
int Kruskal(){
    int ans=0,cnt=0;
    init();
    for(int i=0;i<m-1;++i)
        if(mix(point[i].a,point[i].b)){
            ans+=point[i].v;
            ++cnt;
        }
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=0;i<m;++i)
        cin>>point[i].a>>point[i].b>>point[i].v;
    sort(point,point+m,cmp);
    cout<<Kruskal()<<endl;
}

总结

最小生成树模板题,kruskal和prim都可以实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值