并查集+巧妙分块,Codeforces1424B. 0-1 MST

目录

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

Ujan has a lot of useless stuff in his drawers, a considerable part of which are his math notebooks: it is time to sort them out. This time he found an old dusty graph theory notebook with a description of a graph.

It is an undirected weighted graph on n vertices. It is a complete graph: each pair of vertices is connected by an edge. The weight of each edge is either 0 or 1; exactly mm edges have weight 1, and all others have weight 0.

Since Ujan doesn’t really want to organize his notes, he decided to find the weight of the minimum spanning tree of the graph. (The weight of a spanning tree is the sum of all its edges.) Can you find the answer for Ujan so he stops procrastinating?

2、输入输出

2.1输入

The first line of the input contains two integers n and m (1≤n≤10^5, 0≤m≤min(n*(n−1)/2,10^5)), the number of vertices and the number of edges of weight 1 in the graph.

The i-th of the next m lines contains two integers ai and bi (1≤ai,bi≤n, ai≠bi), the endpoints of the i-th edge of weight 1.

It is guaranteed that no edge appears twice in the input.

2.2输出

Output a single integer, the weight of the minimum spanning tree of the graph.

3、原题链接

Problem - 1242B - Codeforces (Unofficial mirror by Menci)


二、解题报告

1、思路分析

思来想去只能想到O(n^2)解法,看到大佬一句话点破梦中人了属于是orz。

朴素思想:直接跑生成树——MLE

进一步:无权边连通块数目-1即为答案——如果只能想出O(n^2)解法会TLE

一个特别妙的思路:因为一共有m条带权边,那么只考虑带权边的情况下所有节点的出度入度之和为2*m,那么假如最小度为dmin,那么度为dmin的点不会超过2*m/n!!!(这个不难想

精彩的来了:我们先拿到一个最小度的点,O(n)求出它所在的无权边连通块,那么剩下的点中的无权边连通块的数目即为答案

那么如何求剩下点的无权连通块呢?

剩下的点不超过2*m/n个,我们对于每个点都枚举1~n的所有点,如果两个点之间没有边就合并

这一步骤时间复杂度为O(2*m/n * n) = O(m)!!!

所以我们在O(N+M)的时间内就解决了问题

最坏情况下,如果最小度的点特别多,我们效率仍然是线性的(可以结合n,m的数据范围想一下

2、复杂度

时间复杂度:O(n+m) 空间复杂度:O(m)

3、代码详解

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100005;
const int M = 505;
int n, m, cnt;
bool g[M][N];
struct edge
{int u, v;
} edges[N];
int deg[N], minid = 0;
int p[N];
int seq[N], tot = 0, pos[N];
int findp(int x)
{return p[x] < 0 ? x : p[x] = findp(p[x]);
}
bool Union(int x, int y)
{int px = findp(x), py = findp(y);if (px == py)return false;if (p[px] > p[py])swap(px, py);p[px] += p[py], p[py] = px;return true;
}
bool vis[N];
int main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);// freopen("in.txt", "r", stdin);cin >> n >> m, memset(p, -1, sizeof(p));for (int i = 1, u, v; i <= m; ++i)cin >> u >> v, edges[i] = {u, v}, ++deg[u], ++deg[v];minid = 1;for (int i = 2; i <= n; ++i)if (deg[i] < deg[minid])minid = i;for (int i = 1; i <= m; ++i){if (edges[i].u == minid)vis[edges[i].v] = true;if (edges[i].v == minid)vis[edges[i].u] = true;}for (int i = 1; i <= n; ++i)if (vis[i])seq[++tot] = i, pos[i] = tot;elseUnion(i, minid);for (int i = 1; i <= m; ++i){if (vis[edges[i].u])g[pos[edges[i].u]][edges[i].v] = true;if (vis[edges[i].v])g[pos[edges[i].v]][edges[i].u] = true;}for (int i = 1; i <= tot; ++i)for (int j = 1, u = seq[i]; j <= n; ++j)if (g[i][j])continue;elsecnt += Union(u, j);cout << tot - cnt;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/655204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity中使用Ultraleap的Slider组件

Unity中使用Ultraleap的Slider组件&#xff0c;实现物体在指定范围内滑动&#xff1a; 本节在上一节基础上进行&#xff0c;上一小结参考如下&#xff1a; Unity中使用Ultraleap的InteractionButton组件 本节工程文件如下&#xff1a; Unity中使用Ultraleap的Slider组件 1、在…

如何隐藏Selenium特征实现自动化网页采集

Selenium是一个流行的自动化网页测试工具&#xff0c;可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而&#xff0c;有些网站会检测浏览器是否由Selenium驱动&#xff0c;如果是&#xff0c;就会返回错误的结果或拒绝访问。为了避免这种情况&#xff0c;我们需要…

Linux编程 1/2 数据结构

数据结构: 程序 数据结构 算法 1.数据结构: 1.时间复杂度: 数据量的增长与程序运行时间增长所呈现的比例函数,则称为时间渐进复杂度函数简称时间复杂度 O(c) > O(logn)> O(n) > O(nlogn) > O(n^2) > O(n^3) > O(2^n) 2.空间复杂度: 2.类…

网络安全防御保护 Day4

要点一&#xff1a;防火墙的智能选路 就近选路&#xff1a; 在访问不同运营商的服务器时直接通过对应运营商的链路&#xff0c;以此来提高通信效率&#xff0c;避免绕路。 策略路由&#xff08;PBR&#xff09;&#xff1a; 这是一种基于用户定义的策略&#xff08;如业务需求、…

【MATLAB源码-第128期】基于matlab的雷达系统回波信号仿真,输出脉压,MTI,MTD等图像。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 ​雷达&#xff08;Radio Detection and Ranging&#xff09;是一种使用无线电波来探测和定位物体的系统。它的基本原理是发射无线电波&#xff0c;然后接收这些波从目标物体上反射回来的信号。通过分析这些反射波&#xff0…

基于 MATLAB 语言的 BP 神经网络的改进算法

摘 要: 针对标准 BP 算法存在的缺陷, 本文给出了基于 MATLAB 语言的 BP 神经网络几种改进的算法. 阐述了各种 BP 算法的优化技术原理、优缺点, 并就它们的训练速度和内存消耗情况作了比较. 建议在多数 BP 神经网络训练 时, 先尝试使用 Levenberg- Marquardt 算法, 其次是 BFGS …

STM32的分类和选型

F系列&#xff08;主要用于普通应用&#xff09; STM32F0xx&#xff1a;低成本、低功耗&#xff0c;适用于成本敏感和低功耗的应用。STM32F1xx&#xff1a;中低端微控制器&#xff0c;具有丰富的外设和良好的性能。STM32F2xx&#xff1a;高性能微控制器&#xff0c;适用于要求…

二维数组的学习

前言 在前面我们学习了一维数组&#xff0c;但是有的问题需要用二位数组来解决。 二维数组常称为矩阵&#xff0c;把二维数组写成行和列的排列形式&#xff0c;可以有助于形象化的理解二维数组的逻辑结构。 一、二维数组的定义 二维数组定义的一般格式&#xff1a; 数据类型 数…

【英语趣味游戏】填字谜(Crossword)第2天

谜题出处 柯林斯字谜大全&#xff08;6&#xff09;&#xff0c;Collins——Big Book of Crosswords (Book 6) Puzzle Number: 115 本期单词 横向 1、Fetch (8) 拿&#xff0c;取&#xff0c;8个字母 答案&#xff1a;Retrieve&#xff0c;取到&#xff0c;拿回 5、Common s…

C/C++笔记-使用mysql-connector-c连接mysql数据库

驱动在这个地方下载&#xff1a; MySQL :: Download MySQL Connector/C (Archived Versions) 我下载的是&#xff1a;mysql-connector-c-6.1.11-winx64 解压后lib有2个&#xff0c;一个是libmysql.lib一个是mysqlclient.lib 他们的区别如下&#xff1a; libmysql.lib 和 m…

elementui中的tree自定义图标

需求&#xff1a;实现如下样式的树形列表 自定义树的图标以及点击时&#xff0c;可以根据子级的关闭&#xff0c;切换图标 <el-tree :data"treeList" :props"defaultProps"><template #default"{ node, data }"><span class&quo…

【C/C++ 02】希尔排序

希尔排序虽然是直接插入排序的升级版本&#xff0c;和插入排序有着相同的特性&#xff0c;即原始数组有序度越高则算法的时间复杂度越低&#xff08;预排序机制&#xff09;&#xff0c;但是是不稳定排序算法。 为了降低算法的时间复杂度&#xff0c;所以我们需要在排序之前尽…

ARCGIS PRO SDK 数据库属性域设置与获取

一、数据库创建属性域。 sdk3.1 以下的开发版本不支持&#xff0c;不能使用 Pro SDK 向域添加新的编码值&#xff0c;可以使用地理处理工具&#xff1a; 创建属性域 Dim va As IReadOnlyList(Of String) Dim gpResult As ArcGIS.Desktop.Core.Geoprocessing.IGPResult Dim env…

【EEG信号处理】ERP相关

ERP&#xff0c;全称为event-related potential&#xff0c;中文是事件相关电位。 首先要明确的一点是&#xff0c;ERP是根据脑电图EEG得到的&#xff0c;他是EEG的一部分&#xff0c;是最常用的时域分析方法 可能有一部分是介绍不到的&#xff0c;望谅解 在维基百科中给的定义…

力扣题集(第一弹)

一日练,一日功;一日不练十日空。 学编程离不开刷题&#xff0c;接下来让我们来看几个力扣上的题目。 1. 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数…

docker 修改镜像存储路径

Docker的默认存储路径通常是磁盘上的一个临时目录。在默认情况下&#xff0c;Docker容器的数据存储在/var/lib/docker目录下&#xff0c;但是这个路径可能会在系统磁盘空间不足时变得不可用。因此&#xff0c;为了确保数据的可靠性和可用性&#xff0c;有必要更改Docker的默认存…

仅使用 Python 创建的 Web 应用程序(前端版本)第12章_总结

在栏目中&#xff0c;我们使用 Streamlit 等 Python 模块创建了一个 Web 应用程序&#xff0c;而无需编写任何 HTML/JS/CSS。 我希望这能帮助那些已经开始使用 Flask/Django/FastAPI 但对 HTML/JS/CSS 感到沮丧的人&#xff0c;或者那些想要快速创建演示应用程序的人。 WTS 源代…

flutter制作APP的学习

1. 先从flutter对应的前端知识入手 a. 屏幕适配规律&#xff0c;解决大小样式问题 https://juejin.cn/post/7039868577658175524 &#xff08;选择screenutil的使用指南&#xff1a;【Flutter】屏幕像素适配方案 ( flutter_screenutil 插件 )-CSDN博客 Futter 屏幕适配框架…

Manjaro Linux 安装 VirtualBox及VirtualBox命令行

Manjaro 安装GUI VirtualBox 客户端 在 Manjaro Linux 上&#xff0c;你可以使用 pamac 包管理器来安装 VirtualBox。以下是在终端中执行安装 VirtualBox 的命令&#xff1a; 打开终端。 运行以下命令来安装 VirtualBox&#xff1a; pamac install virtualbox如果提示输入管理…

jenkins job无法停止

jenkins 构建job没有启动&#xff0c;构建号点进去杀不掉&#xff0c;左侧没有abort按钮。 进到 “管理Jenkins” -> “脚本控制台” 运行以下脚本&#xff08;需要指定JobName和JobNumber&#xff0c;job名如如果套文件夹&#xff0c;比如cds文件夹下面名字为auto的job&am…