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

最小生成树_LuoguP1669

时间:2023-05-30 15:45:45浏览次数:55  
标签:cnt int 最小 long 生成 fa edge LuoguP1669 find

P1669 P1669 [USACO04DEC] Bad Cowtractors S

题目传送门

题意简化:在一个有 \(N\) 个点 \(M\) 条边的图中选出 \(N-1\) 条边构成一棵树,使得树的总边权最大,求最大总边权。

上述问题即为最小(大)生成树问题,本题为最大生成树,如有未详者可以移步 P3366

该问题一般是 Kruskal 和 Prim 算法,下面提供代码。

  • Kruskal 算法基于排序后的贪心,以并查集确保其正确性。复杂度 \(O(mlogm)\) 用得更多。
  • Prim 算法更像是 Dijkstra,通过松弛操作不断更新入树路径。复杂度 \(O(n^2)\) 在稠密图中有应用。
  • 注意这个图可能是不连通的,最后要判断是否选中了 \(N-1\) 条边。
  • 经试,这道题并没有必要开 long long,似乎有两篇题解写错了。

Kruskal 版

// 2023/5/30 Author:ForMyDream
#include<iostream>
#include<algorithm>
#define maxn 20001
//#define int long long
using namespace std;
int n,m,head[maxn],cnt,fa[maxn],ans,tot;
struct Edge{ int u,v,nxt,w; }edge[maxn];
bool cmp(Edge a,Edge b){ return a.w>b.w; }
void add(int u,int v,int w){ 
	edge[++cnt].v=v,edge[cnt].u=u,edge[cnt].w=w,
	edge[cnt].nxt=head[u],head[u]=cnt; 
}
int find(int x){ return x==fa[x] ? x : fa[x]=find(fa[x]); }
int merge(int x,int y){	
	int fx=find(x),fy=find(y);fa[fx]=fa[fy]; 
}
void Kruskal(){
	sort(edge+1,edge+m+1,cmp);
	for (int i=1;i<=m;i++){
		int fu=find(edge[i].u),fv=find(edge[i].v);
		if (fu==fv) continue;
		merge(fu,fv);
		ans+=edge[i].w,tot++;
//		printf("选中%d-%d\n",edge[i].u,edge[i].v);
	}
} 
signed main(){
	cin>>n>>m; int u,v,w;
	for (signed i=1;i<=m;i++){ cin>>u>>v>>w; add(u,v,w); }
	for (signed i=1;i<=n;i++) fa[i]=i;
	Kruskal();
	if (tot!=n-1) cout<<-1;
	else cout<<ans;
	return 0;
}


Prim 版

标签:cnt,int,最小,long,生成,fa,edge,LuoguP1669,find
From: https://www.cnblogs.com/CZXsNote/p/17443417.html

相关文章

  • Python 读取图片 转 base64 并生成 JSON
    Python读取图片转base64并生成JSONimportjsonimportbase64img_path=r'D:\OpenSource\PaddlePaddle\PaddleOCR\images\005.jpeg';withopen(img_path,'rb')asfile:image_data1=file.read()image=base64.b64encode(image_data1).de......
  • 代码随想录算法训练营第二十一天|530. 二叉搜索树的最小绝对差、
    【参考链接】530.二叉搜索树的最小绝对差【注意】1.二叉搜索树采用中序遍历,其实就是一个有序数组。2.使用双指针,更快。【代码】1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init__(self,val=0,left=None,right=None):4#......
  • Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载
    有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦。这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了。下面是一个名为CompressUtil的工具类的代码,它提供了一些方法来处理文件压缩和下载操作:importor......
  • C/C++学生成绩管理系统[2023-05-30]
    C/C++学生成绩管理系统[2023-05-30]学生成绩管理系统设计----高级语言课程设计题目问题描述:设学生信息包括:学号、姓名、期末成绩、平时成绩,对学生的学习成绩信息进行管理。设计要求:实现学生信息的录入、修改、插入、删除、查询、计算总评成绩、根据总评成绩排序和划分等级、......
  • 代码随想录算法训练营第21天 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中
     第六章 二叉树part07今日内容    详细布置   530.二叉搜索树的最小绝对差  需要领悟一下二叉树遍历上双指针操作,优先掌握递归 题目链接/文章讲解:视频讲解:  501.二叉搜索树中的众数  和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码......
  • 代码随想录算法训练营第16天 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111
     第六章二叉树part03 今日内容:  ●  104.二叉树的最大深度  559.n叉树的最大深度●  111.二叉树的最小深度●  222.完全二叉树的节点个数 迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  详细布置   104.二叉树的最大深度 (优先掌......
  • 简单control net 使用,建筑风格重新生成
    原图生成海景房方法:启用controlnetAnnotatorresolution(分辨率)可以调小一点预处理器:边缘检测cannymodel:canny-fp16正向提示词: masterpiece,bestquality,building,seaviewroom反向提示词:worstquality,lowquality,normalquality,lowres ......
  • net6 使用 efcore 根据 mysql数据库生成代码
    1.vs中下载程序NuGet包Microsoft.EntityFrameworkCore.ToolsPomelo.EntityFrameworkCore.MySql 把这两个安装好就可以了或者你嫌麻烦也可以直接用命令下载 打开VS2019"工具"->"Nuget包管理器"->"程序包器管理控制台"PM>Install-PackageMicrosoft.EntityFrameworkCore.Too......
  • 灵感生成器DreamGPT开源:见识一下真正的脑洞大开
    ChatGPT最为人诟病的缺陷就是「胡编乱造」了,可以一本正经地讲一段林黛玉倒拔垂杨柳的故事。  对于真正想了解「林黛玉」或「倒拔垂杨柳」的人来说,这段回答可以说是灾难级误导了,但对于专注于「虚构」和「创意」的从业者来说,天马行空幻觉反而可以激发创造力。 最近Diverge......
  • 生成二维码
    依赖<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId>......