Problem: lab-week10-exercise02 Building a Fiber Network

Problem


Analysis

这道题看起来是最小生成树或者最短路之类的,但因为只用输出边权和,所以直接对边权排序用并查集即可,以及在用并查集的时候可以进行路径压缩降低时间复杂度。

Code

C++

cpp 复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int fa[100005];
int f;
bool b=1;
long long ans;

struct edge{
    int u,v,w;
}a[100005];

bool cmp(edge x,edge y){
    return x.w<y.w;
}

int find_fa(int x){
    if(fa[x]==x){
        return x;
    }
    fa[x]=find_fa(fa[x]);
    return fa[x];
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        cin>>a[i].u>>a[i].v>>a[i].w;
    }
    for(int i=1;i<=n;++i){
        fa[i]=i;
    }
    if(n==1){
        cout<<0<<endl;
        return 0;
    }
    if(m<n-1){
        cout<<"IMPOSSIBLE\n";
        return 0;
    }
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=m;++i){
        if(find_fa(a[i].u)!=find_fa(a[i].v)){
            ans+=1ll*a[i].w;
            fa[fa[a[i].u]]=fa[a[i].v];
        }
    }
    f=find_fa(1);
    for(int i=2;i<=n;++i){
        if(find_fa(i)!=f){
            b=0;
            break;
        }
    }
    if(b){
        cout<<ans<<endl;
    }
    else{
        cout<<"IMPOSSIBLE\n";
    }
    return 0;
}
相关推荐
2301_8194143030 分钟前
C++与区块链智能合约
开发语言·c++·算法
Zaly.36 分钟前
【Python刷题】LeetCode 1727 重新排列后的最大子矩阵
算法·leetcode·矩阵
不想看见40437 分钟前
Valid Parentheses栈和队列--力扣101算法题解笔记
开发语言·数据结构·c++
老约家的可汗1 小时前
C/C++内存管理探秘:从内存分布到new/delete的底层原理
c语言·c++
做怪小疯子1 小时前
蚂蚁暑期 319 笔试
算法·职场和发展
天赐学c语言1 小时前
Linux - 应用层自定义协议与序列/反序列化
linux·服务器·网络·c++
计算机安禾1 小时前
【C语言程序设计】第37篇:链表数据结构(一):单向链表的实现
c语言·开发语言·数据结构·c++·算法·链表·蓝桥杯
啊哦呃咦唔鱼1 小时前
LeetCode hot100-73 矩阵置零
算法
阿贵---1 小时前
C++构建缓存加速
开发语言·c++·算法
波特率1152002 小时前
C++当中is-a(继承)与has-a(成员对象)的辨析与使用指南(包含实际工程当中的使用示例)
c++·ros·串口通信