首页 > 其他分享 >最小生成数——prim以及Kruskal

最小生成数——prim以及Kruskal

时间:2024-05-21 23:32:43浏览次数:22  
标签:cnt prim int vi Kruskal 最小 now head

最小生成数——prim以及Kruskal

1.关于prim算法

2.关于Kruskal算法

  • 原理

  • 板子

  • 板子题

prim原理:

对树中的点进行遍历,存点构成一个新图,每次找离新图最近的点加入新图。

代码实现解释

  1. 将起始点的一系列临边的点赋值
 for(int i=head[1];i;i=a[i].next)
    {
        int k=a[i].to;
        vi[k]=min(vi[k],a[i].w); //注意有重边   
    }
  1. 在所有点中找离当前图最近的点,并将最近点标记为now
 for(int i=1;i<=n;i++)
        {
            if(!ans[i]&&ma>vi[i])
            {
                 now=i;
                 ma=vi[i];
            }
        }

3.对now(新加入的点)的临边进行赋值

 for(int i=head[now];i;i=a[i].next)
        {
            int k=a[i].to;
            if(!ans[k]&&vi[k]>a[i].w)
            {
                vi[k]=a[i].w;
            }
        }

prim板子

#include<iostream>
#include<algorithm>
using namespace std;
int head[200005];
int cnt;
int b[200005];
int ans[200005];
int vi[200005];

struct node{
    int next;
    int to;
    int w;
}a[400005];
void add(int x,int y,int w)
{
    a[++cnt].next=head[x];
    a[cnt].to=y;
    a[cnt].w=w;
    head[x]=cnt;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    for(int i=2;i<=n;i++)
    {
        vi[i]=100000000;
    }
    for(int i=head[1];i;i=a[i].next)
    {
        int k=a[i].to;
        vi[k]=min(vi[k],a[i].w); //注意有重边   
    }
   int now=1;
    int r=0;
    int sum=0;
    while(++r<n)
    {
        int ma=100000000;
        ans[now]=1;
        for(int i=1;i<=n;i++)
        {
            if(!ans[i]&&ma>vi[i])
            {
                 now=i;
                 ma=vi[i];
            }
        }
        if(ma==100000000)
        {
            cout<<"orz";
            return 0;
        }
        sum+=ma;
        for(int i=head[now];i;i=a[i].next)
        {
            int k=a[i].to;
            if(!ans[k]&&vi[k]>a[i].w)
            {
                vi[k]=a[i].w;
            }
        }
    }
    cout<<sum;
    return 0;
}

标签:cnt,prim,int,vi,Kruskal,最小,now,head
From: https://www.cnblogs.com/wl1917/p/18205171

相关文章

  • 「网络流浅谈」最小割的模型
    最大权闭合子图引入Introduction闭合子图指对于子图\(G=(V,E)\),\(\forallu\inV,(u,v)\inE\),都有\(v\inV\)。最大权闭合子图无非就是对于所有的闭合子图\(G\)中\(\sum_{u\inV}w_u\)最大的闭合子图。对于这个图中,闭合子图有哪些呢?红色框圈画出的即为\(1\)个......
  • CSP历年复赛题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • 【Halcon】实现分离通道、创建矩形、获取灰度级、求最大最小均值、求大于某一灰度级的
    read_image(Image,'D:/image/123.jpg')rgb1_to_gray(Image,GrayImage)gen_rectangle1(Rectangle,100,100,200,200)rectangle1_domain(GrayImage,ImageReduced,100,100,200,200)crop_domain(ImageReduced,ImagePart)get_region_points(ImageP......
  • 指针练习5*5矩阵最大最小值
    将最大值放在5*5矩阵中央将左上右上左下右下分别放第1,2,3,4的最小值#include<stdio.h>#include<math.h>#include<string.h>#defineN5voidMove(int(*arr)[N]);int*Max(int(*arr)[N]);voidMin4(int(*arr)[N]);voidSwap(int*x,int*y);intmain(){intarr[5]......
  • primethus
    监控介绍监控数据流程介绍监控优势如果监控的是物理机,则用Zabbix,Zabbix在传统监控系统中,尤其是在服务器相关监控方面,占据绝对优势。甚至环境变动不会很频繁的情况下,Zabbix也会比Pometheus好使。但如果是云环境的话,除非是Zabbix玩的非常溜,可以做各种定制,否则还是Prometheus......
  • 《代码随想录》-3.长度最小的子数组
    题目:给定一个含有n个正整数的数组和一个正整数s,找出该数组中满足其和≥s的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0。滑动窗口:只用一个for循环,其索引指向窗口终点位置窗口是满足其和>=s的最小长度的连续数组当窗口大于等于s,起始位置就要......
  • 「网络流浅谈」最小割的模型 1
    最大权闭合子图引入闭合子图指对于子图\(G=(V,E)\),\(\forallu\inV,(u,v)\inE\),都有\(v\inV\)。最大权闭合子图无非就是对于所有的闭合子图\(G\)中\(\sum_{u\inV}w_u\)最大的闭合子图。对于这个图中,闭合子图有哪些呢?红色框圈画出的即为\(1\)个闭合子图,因为......
  • P3366 【模板】最小生成树
    链接:https://www.luogu.com.cn/problem/P3366模板题:kruskal代码:核心是对边的排序,遍历,选择。#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<......
  • 最小子段和
    #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN10#defineMAX_RANDOM_NUM20/***求最大子段和*情况1:左子段长*情况2:右子段长*情况3:右子段一部分和左子段一部分相连长*@paramarr数组*@paramleft左......
  • P2765 魔术球问题(最小路径点覆盖)
    link这个题目很不同,它给出的是柱子的数量,要反推球的数量。可以这样认为,给出边数,求上面的点数。每次只能在某根柱子的最上面放球->点的连接方式是一串串的,易发现图是个DAG;然后好像没什么可推的性质了。题目没给出点数,那肯定要去不断试不同的点数n,每次进行判定是否符合......