题解 | #Forsaken喜欢独一无二的树#

Forsaken喜欢独一无二的树

https://ac.nowcoder.com/acm/problem/53074

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
struct edge{
    int a,b,w;
    bool operator < (const edge &b) const{
        return w<b.w;
    }
}edges[N];
int n,m;
int p[N];
int ffind (int x){
    if(p[x]!=x) p[x]=ffind(p[x]);
    return p[x];
}
void kruskal(){
    int ans=0;
    for(int i=0;i<m;){
        //从i开始 找到所有与i的权值相等的边 最后一个是j-1
        int j=i;
        for(;j<m;j++){
            auto [a,b,w]=edges[j];
            if(edges[i].w==w) {
                if(ffind(a)!=ffind(b)){
                    ans+=w;
                }
            }else break;
        }
        //已经找到权值相等的边 从中挑出必须保留的边 从ans中删去
        //因为ans存的是需要删除的边 所以需要保留的边要从中删去
        for(;i<j;i++){
            auto [a,b,w]=edges[i];
            a=ffind(a),b=ffind(b);//注意要把值赋给a,b 否则下面p[a]=b就错了
            if(a!=b){
                p[a]=b;
                ans-=w;
            }
        }
    }
    cout<<ans<<endl;
}
signed main(){
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        edges[i]={a,b,c};
    }
    sort(edges,edges+m);
    for(int i=1;i<=n;i++) p[i]=i;
    kruskal();
}


全部评论

相关推荐

不愿透露姓名的神秘牛友
09-19 14:43
实习之后才知道团队氛围的重要性来了一周,从第三天就开始想离职……团子背景、薪资福利再怎么好,也不香了
码农索隆:确实,团队的氛围真的很影响心情,好的团队上班感觉轻松愉快,不好的团队,每天没事就整点幺蛾子
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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