首页 > 其他分享 >最小生成树学习笔记

最小生成树学习笔记

时间:2023-05-27 16:22:14浏览次数:41  
标签:int 1000005 最小 笔记 生成 集合 dis

什么是最小生成树

一个图中可能存在多条相连的边,我们从一个图中挑出一些边生成一棵树(树就是指一个无向连通图不包含回路(连通图中不存在环))。

这仅仅是生成一棵树,还未满足最小,当图中每条边都存在权重时,这时候我们从图中生成一棵树(n - 1 条边)时,生成这棵树的总代价就是每条边的权重相加之和。

Kruskal

首先我们先将这几个点每个独自成为一个集合,将一些连接这些集合的边,按照权值从小到大排序,每次加入最小的边,将边两端的集合合并成一个集合,但要保证这两个点不在同一个集合,而怎么判断他们有没有联通呢,这时,我们就可以用到并查集了。

并查集

详见博客(暂无

然后如果他们在同一个集合就换下一条边。题目详见(P3366

code

#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
inline int read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
int cnt,sum,f[maxn],n,m;
struct rode{
    int x,y,z;
}a[maxn];
int find(int k){
    if(f[k]==k) return k;
    return f[k]=find(f[k]);
}
bool cmp(rode a,rode b){
    return a.z<b.z;
}
int main () {
    cin>>n>>m;
    for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++)
        cin>>a[i].x>>a[i].y>>a[i].z;
    sort(a+1,a+1+m,cmp);
    for(int i=1;i<=m;i++){
        int fx=find(a[i].x),fy=find(a[i].y);
        if(fx==fy) continue;
        f[fy]=fx;
        sum+=a[i].z;
		cnt++;
		if(cnt==n-1) break;
    }
    if(cnt!=n-1) cout<<"orz";
    else cout<<sum;
    return 0;
}

Prim

Prim的主要思路如下:

1.首先从任意一个顶点开始构造最小生成树,并标记那些点已经加入了最小生成树。

2.用dis(假设是dis)存储每个点离生成树的距离。

3.选出离生成树最近的定点加入到生成树中。

一直循环,直到生成树有n个顶点。

Code

#include<bits/stdc++.h>
using namespace std;
int n,m,min,t1,t2,t3;
int e[10005][10005],book[1000005]={0},dis[1000005];
int inf=INT_MAX;
int cnt=0,sum=0;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i==j) e[i][j]=0;
            else e[i][j]=inf;
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&t1,&t2,&t3);
        e[t1][t2]=t3;
        e[t2][t1]=t3;
    }
    for(int i=1;i<=n;i++)
        dis[i]=e[1][i];
    int i,j,k;
    book[1]=1;
    cnt++;
    while(cnt<n){
        min=inf;
        for(i=1;i<=n;i++)
            if(book[i]==0&&dis[i]<min){
                min=dis[i];
                j=i;
            }
        book[j]=1;
        sum+=dis[j];
        cnt++;
        for(k=1;k<=n;k++)
            if(book[k]==0&&dis[k]>e[j][k])
                dis[k]=e[j][k];
    }
    printf("%d\n",sum);
    return 0;
 }

标签:int,1000005,最小,笔记,生成,集合,dis
From: https://www.cnblogs.com/pdpdzaa/p/17436906.html

相关文章

  • 思考-关于纸质还是电子笔记
    原因有长期用纸质记录规划每天生活的习惯,但是由于长期使用键盘打字,在使用纸笔写字的过程中,写字速度有点慢,手写速度更不上大脑的思考速度;其次,手部手写过程中出现不适感,而在打字的过程中,虽然有打错字的概率,但总体上还行。纸质的好处写作的内容较为随意写作的方式、风格较为......
  • raft笔记
    目的:一致性算法,允许一组机器作为一个一致的组来工作,这些组可以承受某些成员的故障,提高可用性领导选举,日志同步,快照,集群变动复制状态机用于解决分布式系统中的各种容错问题,会出现共识算法共识和复制状态机通过保持复制日志的一致性raft是一种日志复制算法Raft通过首先选举一个......
  • DAY15笔记及补充
    今日默写:1.强制类型转换2.Scanner 类的使用步骤3.基本if选择结构4.if-else选择结构5.多重if选择结构6.嵌套if选择结构7.switch选择结构8.手写main函数9.自动类型转换10.描述下switch和if多重分支的区别得分:100分补充:1.ifelse分支中存在一定的顺序问题,就是从上至下范围应该越......
  • FFMpeg笔记(十二)MP4 box解析
      MP4包含3大box。一、ftypfiletypebox,包含视频文件使用的mp4标准,也作为probemp4的标志;二、moov包含媒体的元数据信息,包含一个mvhd(也就是headerbox)和若干个trak(track)。trak包含一条音/视频轨道信息和音视频数据的编码格式、音视频数据样本、chunks的大小,存储位置,PTS等......
  • 数学期望DP学习笔记
    数学期望:在概率论和统计学中,数学期望(mathematicexpectation)(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。——摘自百度百科不懂?太正常了,百度百科就是不写人话。举个栗子解释一下:下面看一道例题:蓝桥......
  • LangChain学习笔记1:基本概念
    GPT:x中之事,事无大小,悉以咨之概念加载器(Loader)从某种介质中获取数据,即加载。文档(Document)数据转换成文档进行处理。类比数据库转换成记录……文本分割(TextSpltter)LLM一次处理的数据有限,分割成多批进行处理。向量数据库(Vectorstores)文档转换成向量,把文档存入到向量数据库,自动转换成......
  • 代码生成器
    代码生成器原理是读取表结构,根据表结构的字段名称、数据类型、注释生成实体类,然后根据实体类生成controller和servicefreemarker标签参数${pramName}:根据controller中定义的值,对pramName进行替换<#if>:当结果为true时才会进行展示<p>你好,<#ifuserName=="lyra">......
  • 带宽、网速各种单位换算笔记(一)
    废话不说直接上干货网络带宽计算方法这里指的是带宽网速的单位计算方式方法及关系在计算机网络、IDC机房中,其宽带速率的单位用bps(或b/s)表示;换算关系为:1Byte=8bit1B=8b----------1B/s=8b/s(或1Bps=8bps)1KB=1024B----------1KB/s=1024B/s1MB=1024KB----------1MB/s=1024K......
  • 【Linux学习笔记】设备驱动模型详解——总线、设备、驱动和类
    简介设备驱动是计算机系统中的重要组成部分,它们允许操作系统与硬件交互。设备驱动模型是一种通用的抽象框架,用于描述操作系统如何管理硬件设备。这里我们将介绍设备驱动模型中的四个关键概念:总线、设备、驱动和类。总线在计算机系统中,总线是指多个设备之间传输数据的路径。总线......
  • m基于FPGA的LDPC最小和译码算法verilog实现,包括testbench和matlab辅助验证程序
    1.算法仿真效果matlab2022a/vivado2019.2仿真结果如下:matlab仿真:0.5码率,H是4608×9216的矩阵。FPGA仿真:对比如下:2.算法涉及理论知识概要LDPC译码分为硬判决译码和软判决译码。硬判决译码又称代数译码,主要代表是比特翻转(BF)译码算法,它的实现比较简单,但是译码性能很差......