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

最小生成树

时间:2023-07-19 17:33:11浏览次数:15  
标签:dist int 边权 最小 生成 edge

生成树 : 如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树

最小生成树 : 边权和最小的生成树叫做最小生成树。如果原图不连通,则没有最小生成树

求最小生成树有两种方法 : prim 和 kurskal

一. prim算法

将最小生成树看做一个集合,每次选取距离集合最近的点,如果这个点不在集合中则加入集合,也就意味着这个点和集合里的点所连成的边加入了集合。最后等到所有点都加入集合则所有进入集合的边构成最小生成树。


例题1 prim板子

给你一张 n 个顶点 m 条边的无向简单连通图,顶点编号从 1 到 n,每条边都有一个边权,边权为非负整数。

请求出这张图的最小生成树,只需要输出最小生成树的边权和即可。

输入格式
第一行两个整数 n,m 表示图的顶点数、边数。

接下来 m 行,每行三个整数 x,y,z 表示 x 号点与 y 号点之间有一条边权为 z 的边。

数据保证图中顶点两两连通。

输出格式
输出一行一个数,表示最小生成树的边权和。

样例输入
4 4
1 2 1
2 3 3
3 4 1
1 4 2
样例输出
4
数据规模
对于所有数据,保证 2≤n≤1000,n−1≤m≤100000,1≤x,y≤n,1≤z≤10000


代码

# include<bits/stdc++.h>
 
using namespace std;
typedef pair<int,int> pii;
 
const int N = 1e4+10;
vector<pii> edge[N];
int dist[N];	//这里的dist是指点到集合(生成树)的距离
bool st[N];
int n,m;
 
int prime()
{
	memset(dist,0x3f,sizeof dist);
	dist[1] = 0;
	priority_queue<pii,vector<pii>,greater<pii> > q;
	q.push({dist[1],1});
	int ans = 0;			//ans是最小生成树的权值和
	int tot;tot = 0;		//tot存的是集合中的点的数量,如果结束的时候tot != n则证明无法构造出生成树
	while(q.size())
	{
		auto t = q.top();q.pop();	//找出距离集合最小的点
		if(st[t.second]) continue;	//每次取到集合最近的点,如果这个点已经在集合中则continue
		tot++;
		ans+=t.first;st[t.second] = true;
		for(auto i:edge[t.second])
		{
			if(dist[i.first]>i.second) 	//注意这里dist要和边权比,因为边权最终是距离集合的距离
			{
				dist[i.first] = i.second;
				q.push({dist[i.first],i.first});
			}
		}
	}
	if(tot!=n) return -1;
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int x,y,z;scanf("%d%d%d",&x,&y,&z);
		edge[x].push_back({y,z});edge[y].push_back({x,z});
	}
	cout<<prime()<<endl;
	return 0;
}

例题2

在一片海域上有 n

标签:dist,int,边权,最小,生成,edge
From: https://www.cnblogs.com/algoshimo/p/17566277.html

相关文章

  • Wix AI:用提示词生成网站
    基于模板的网站构建器Wix宣布,很快您将可以通过在框中输入描述并回答一些后续问题来创建整个网站。从设计到文本和图像,所有内容都会自动为您生成,从外观上看,速度会非常快。过去,Wix和WordPress.com等公司允许您使用模板创建网站,您可以根据自己的喜好进行调整。但Wix表示,其新......
  • 黑群晖DSM7.2安装虚拟机生成序列号
    开启主板虚拟化!!!!存储空间系统格式btrfs 启用网卡OpenVSwitch设置  安装套件VirtualMachineManager      创建虚拟机    下一步直到完成,开启虚拟机  剩下就是链接助手链接虚拟机,配置一下就可以了全部完成后进入系统,打开控制面......
  • 解决安装Pycharm后在C盘下生成大文件的问题
    今日鸡汤郑国游人未及家,洛阳行子空叹息。前言上次在整理C盘时,无意间发现了一个这样的文件。在我的用户目录下,有个.PyCharm2019.3这样的文件夹,我猜想和Pycharm可能有什么py关系。那这个文件有多大呢,来操作一下康康。雾草,竟然0.5个G了,我才刚用没多久唉!这对于我这强迫症来说很难......
  • 历年检测、分割、生成算法梳理(2023)
    检测算法 分割算法 生成算法 ......
  • Java 生成旋螺矩阵
    @TestpublicvoidvirtualMain(){int[][]matrix=generateMatrix(9);MyArray.printSquareArray(matrix,2);}publicint[][]generateMatrix(intn){int[][]res=newint[n][n];intsquare=n*n,i=(int)......
  • android生成jks和keystore
    Android生成JKS和Keystore在Android开发中,我们经常需要为应用程序生成数字证书,以确保应用程序的安全性和完整性。生成JKS(JavaKeyStore)和Keystore是Android开发中的一项重要任务。本文将介绍什么是JKS和Keystore,以及如何使用AndroidStudio生成它们。我们还将提供示例代码来演示如......
  • sliver生成木马.sh
    生成sliver木马多个步骤合成一个sh#!/bin/bash#date:20230222host_ip=$1WORK_DIR=/opt/workrm-rf/root/.sliver-client/cd${WORK_DIR}/sliverrm-rfadjectives.txtbas_192.0.2.1.cfgmuma_x*nouns.txtsliver.dbversionconfigs/database.jsonconfigs/htt......
  • 取字典中最大最小值对应的键
    取字典中最大最小值对应的键#取最大值对应的键tmp_dict={"a":1,"b":3,"c":9,"d":13}max_key=max(tmp_dict,key=lambdax:tmp_dict[x])print(f"maxkey:{max_key}")#取对小值对应的键tmp_di......
  • 1851. 包含每个查询的最小区间 (Hard)
    问题描述[1851.包含每个查询的最小区间](Hard)给你一个二维整数数组intervals,其中intervals[i]=[leftᵢ,rightᵢ]表示第i个区间开始于leftᵢ、结束于rightᵢ(包含两侧取值,闭区间)。区间的长度定义为区间中包含的整数数目,更正式地表达是rightᵢ-leftᵢ+1......
  • Oracle生成UUID
    使用sys_guid()获取oracleUUID,会出现乱码问题,使用库函数对sys_guid()进行处理,则是标准UUID大写UUIDSELECTsys_guid(),rawtohex(sys_guid())fromdual小写uuidSELECTlower(rawtohex(sys_guid()))fromdual......