首页 > 编程语言 >KY148 还是畅通工程C++

KY148 还是畅通工程C++

时间:2024-02-18 16:34:07浏览次数:29  
标签:KY148 set weight int 回路 C++ edge 畅通 节点

求图的最小生成树。克鲁斯卡尔算法来解决。就是选择n-1条最小边且无回路。

回路判断用并查集就行。

即要加入的边(两个节点)具有相同的父节点说明如果这两个节点本来就存在路径,再加入一条边就会产生回路,舍去。

#include<iostream>
#include<algorithm>
using namespace std;

struct node{
    int n1;
    int n2;
    int weight;
};
typedef struct node edge;

bool cmp(edge l, edge r){//true no exchange
    return l.weight <= r.weight;
}

void init_edge(edge e[]){
    for(int i=0;i<5000;i++){
        e[i].weight=9999;
        e[i].n1=-1;
        e[i].n2=-1;
    }
}

int getfather(int set[],int i){
    if(set[i]==i) return i;
    return getfather(set,set[i]);
}

void merge_set(int set[],edge e,int* sum){
    if(getfather(set,e.n1)!= getfather(set,e.n2)) {
        *sum+=e.weight;
        if(getfather(set,e.n1)<getfather(set,e.n2)){
            set[getfather(set,e.n2)]=getfather(set,e.n1);
        }else{
            set[getfather(set,e.n1)]=getfather(set,e.n2);
        }
    }
}

void init_set(int set[]){
    for(int i =0;i<101;i++){
        set[i]=i;
    }
}

int main(){
    int n=0;
    while(cin >> n){
        if(n==0) break;
        edge e[5000];
        int set[101]={0};
        init_set(set);
        init_edge(e);
        for(int i=0;i<n*(n-1)/2;i++){
            cin >> e[i].n1 >> e[i].n2 >> e[i].weight;
        }
        sort(e,&e[n*(n-1)/2],cmp);
        int sum=0;
        for(int i=0;i<n*(n-1)/2;i++){
            merge_set(set,e[i],&sum);
        }
        cout << sum <<'\n';
    }
    return 0;
}

 

结果如下:

标签:KY148,set,weight,int,回路,C++,edge,畅通,节点
From: https://www.cnblogs.com/llllmz/p/18016744

相关文章

  • C++ 模板的笔记1
    C++模板的笔记1C++函数模板函数模板的定义函数模板是一种可以生成不同类型函数的函数声明。函数模板的参数类型不是固定的,而是在调用时由实参类型推导出来。语法:template<typename参数列表>函数返回值类型函数名(参数列表){函数体}示例:template<typenameT>vo......
  • 【c&c++】cJSON详解
    一、JSON概述1.1JSON介绍JSON:JavaScript对象表示法(JavaScriptObjectNotation)。是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似C语音家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON......
  • 阅读下面 C++ 代码,输出结果为()
    #include<iostream>usingnamespacestd;classbase1{private:inta,b;public:base1(inti):b(i+1),a(b){}base1():b(0),a(b){}intget_a(){returna;}intget_b(){returnb;}};intmain()......
  • C++ STL map
    map<int,string>MyMap;//下标方式key值重复进行替换MyMap[0]="233";MyMap[0]="23333";//insert方法key值重复无法插入MyMap.insert(pair<int,string>(1,"zhangsan"));MyMap.insert(pair<int,string>(1,"zhangsan2"))......
  • C++——数据类型笔记
    在C++编程中,了解各类数据类型也是至关重要的。下面我会总结一下C++中的数据类型,包括基本类型,符合类型和自定义类型。方便自己整理和理解。1,基本类型C++中的基本类型是构建其他数据类型的基础,常见的基础类型包括整型,浮点型,字符型和布尔型:整型:用于表示整数,如int、short......
  • 《安富莱嵌入式周报》第332期:铷时钟控制板,航天战斗机C++代码标准,免费开源芯片设计,在线
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版https://www.bilibili.com/video/BV1tU421d7ZK/目录:1、Rubidium铷时钟控制板2、开源小设计,简易万用表连通性测试仪3、免费开源芯片设计软件Electric4、在线电路仿......
  • C++左值引用、右值引用、移动语义、完美转发、深浅拷贝
    一、左值和右值定义(能否取地址)1.左值:可以取地址的对象2.右值:不可以取地址、临时要销毁的对象二、左值引用1.定义:对左值的引用int&ra=a;2.作用:传递参数和返回值时减少不必要的拷贝三、右值引用1.定义:对右值的引用//以下是对几种右值的右值引用int&&rr1=10;doubl......
  • C++ 20 协程
    目录c++协程类型协程的状态协程的挂起await_readyc++协程类型ResultCoroutine(){std::cout<<1<<std::endl;co_awaitstd::suspend_always{};std::cout<<2<<std::endl;std::cout<<3<<std::endl;co_awaitstd::suspend_always{}......
  • C++文件输入输出的简单实现(Debug)
    1.前言:        文件输入输出是个很有用的东西,有时比赛时要有:要求使用文件输入输出,还有时候……    遇到这种时间限制非常恶心的题目:手动测试会有误差……    文件输入输出是个很好的选择!2.写法:C    C语言的写法有点复杂,涉及文件指针,本文不......
  • C++类型转换
    C++类型转换静态转换:​ 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换//指针voidtest02(){ Father*f=NULL; Son*s=NULL; //向下转换不安全 Son*s1=static_cast<Son*>(f); //向上转换安全 Father*f1=static_cast<Father*>(s); //没有继......