首页 > 其他分享 >最小生成树

最小生成树

时间:2023-08-10 23:00:26浏览次数:32  
标签:node 联通 int 最小 生成 代价 cmp

最小生成树

基本概念

最小生成树是用最小的代价来使这个图联通。

题目链接

它输入的有连接两条边的代价,我们要在这个图是联通的情况下,付出的代价最小。
前置知识:并查集

Kruskal

基本概念
  • 我们可以先把这写边按照代价排序。接着,我们依次从1到\(n\)枚举这个排好序数组中的元素,依次判断每条边是否已经相通,如果是,那就跳过,否则就连通两条边,并且将计数器加上连接这条边的代价。
  • 题目还说,如果怎么都无法让这个图任意两点都联通,就输出\(orz\),那么就可以再用一个计数器,每次连接一条边就加以,表示这个图的边多了一条。最后如果这个计数器不等于\(n-1\),那就说明——这个图不联通!
代码

先定义一个结构体,里面存着\(x,y,z\)。

struct node{
    int x,y,z;
};

接下来,输入这个结构体。

vector<node> r(n);
for(int i=0; i<n; i++){
    cin>>r[i].x>>r[i].y>>r[i].z;
}

我们可以写一个并查集来判断两条变是否是联通的。

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

我们知道,要让这个代价最小,我们可以先按照代价\(z\)的大小将\(r\)数组先进行排序。排完序后再判断每两条边是否已经联通,如果没有联通,那么就可以把两条边连接起来。

\(cmp\)排序函数

bool cmp(node x,node y){
    return x.z<y.z;
}
stable_sort(r.begin(),r.end(),cmp);
int sum=0,cnt=0;
for(int i=0; i<m; i++){
    if(find(r[i].x)!=find(r[i].y)){
        fa[find(r[i].x)]=find(r[i].y);
        sum=sum+r[i].z;
        cnt++;
    }
}

最后,我们知道,一个联通图的边是\(n-1\),如果不是,就输出\(orz\)。

if(cnt!=n-1){
    cout<<"orz"<<endl;
}
else{
    cout<<sum<<endl;
}

完整代码:

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

int fa[10010];

struct node{
    int x,y,z;
};

bool cmp(node x,node y){
    return x.z<y.z;
}

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

int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1; i<=n; i++){
        fa[i]=i;
    }
    vector<node> r(m);
    for(int i=0; i<m; i++){
        cin>>r[i].x>>r[i].y>>r[i].z;
    }
    stable_sort(r.begin(),r.end(),cmp);
    int sum=0,cnt=0;
    for(int i=0; i<m; i++){
        if(find(r[i].x)!=find(r[i].y)){
            fa[find(r[i].x)]=find(r[i].y);
            sum=sum+r[i].z;
            cnt++;
        }
    }
    if(cnt!=n-1){
        cout<<"orz"<<endl;
    }
    else{
        cout<<sum<<endl;
    }
    return 0;
}

标签:node,联通,int,最小,生成,代价,cmp
From: https://www.cnblogs.com/wrl2010/p/17621835.html

相关文章

  • 指数生成函数
    指数生成函数定义:\(F(x)=\sum_{n>=0}\a_n\frac{x^n}{n!}\)加法\(F(x)\pmG(x)=\sum_{i>=0}a_i\frac{x^i}{i!}\pm\sum_{j>=0}\frac{x^j}{j!}\)\(\\\\\\\\\\\\\\\\\\\\\\\=\sum_{n>=0}(a_n\pm......
  • 普通生成函数
    普通生成函数定义:\(F(x)=\sum_{n>=0}\a_nx^n\)加减运算$F(x)\pmG(x)=\sum_{i>=0}\a_ix^i\pm\sum_{j>=0}b_jx^j$\(\\\\\\\\\\\\\\\\\\\\\\\=\sum_{n>=0}(a_n\pmb_n)x^n\)因此\(F(x)\pmG(x)......
  • Jmeter-生成压测报告
     以非GUI命令行执行脚本将Jmeter安装目录\bin添加到系统环境变量path命令参数-n命令行模式-t脚本路径-l测试结果路径(jtl或者csv)-j日志路径-r分布式执行-R远程服务器列表-g生成测试......
  • XMLEncoder生成的xml文档的schema分析
    以下文为基础,进行分析LongTermPersistenceofJavaBeansComponents:XMLSchemahttp://java.sun.com/products/jfc/tsc/articles/persistence3/ 1BasicElements每个xml以一个可选的<?xmlversion="1.0"encoding="UTF-8"?>开头,接着是<javaversion="1.4.0&q......
  • 什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝
    什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝,如何使用什么是迭代器,生成器,装饰器#迭代器-迭代:一种不依赖于索引取值的方式,我们不需要关注它的位置,只要能够一个个取值,它就称之为迭代,python中就是for循环,内部调用对象.__next__()-可迭......
  • 力扣---1289. 下降路径最小和 II
    给你一个 nxn 整数矩阵 grid ,请你返回 非零偏移下降路径 数字和的最小值。非零偏移下降路径 定义为:从 grid 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。 示例1:输入:grid=[[1,2,3],[4,5,6],[7,8,9]]输出:13解释:所有非零偏......
  • Freemarker生成电子协议并转png图片
    目录依赖包配置模板文件目录Java代码html转png图片需要用到wkhtmltopdfFreemarker是一种流行的模板引擎,它可以使用Java、C#、PHP等语言编写模板,并从模板中生成HTML、XML、文本等各种文件格式。Freemarker模板由一个或多个包含变量和指令的文本文件组成,这些变量和指令可以在......
  • 使用keil生成 .bin 文件
    产品结构设计没有预留SW烧录口,导致每次更新程序都要拆壳烧录,要不就是引一根烧录线出来,这种方式导致外观非常不美观,产品展示或演示给人第一印象就不好,刚好产品有串口接口,就打算使用IAP功能升级软件;IAP需要生产BIN文件更新软件,而之前工程生成的都是HEX文件再烧录; 1.hex文件与bin......
  • PR语音生成字幕——文本转录功能【2022.2新功能】
    转录序列会得到一个文本然后点上面的CC,创建字幕,调整一下参数就好了......
  • iMX8MP HDMI图像输出 & V4L2生成MJPEG流
    飞凌嵌入式OKMX8MP-C开发板基于NXP i.MX8MPlus处理器开发设计,该系列处理器专注于机器学习与视觉、高级多媒体以及具有高可靠性的工业自动化。旨在满足智慧城市、工业互联网、智能医疗、智慧交通等应用的需求。强大的四核或双核Arm® Cortex®-A53处理器,主频高达1.6GHz,带有神经......