8.29 活着的意义
题意
给一张\(n\)个点\(m\)条边的无向图,有一个对于这个无向图的操作,即去除图中的一个生成森林(即所有连通块中生成树的集合)。不断对该无向图进行操作直到该图中的边全部被删除。对于每一条边,输出他是在第几次被删除的。
如果有多种方案,输出其中一种即可
解法
首先我们有一个很好想的\(O(MN)\)暴力
遍历每一条边,每次进行生成树操作:具体来说,就是每次开一个并查集,如果该边的两个端点不在同一个连通块中,则把它们联通,并且把该边从边集中删除;否则跳过该边
考虑我们如何对暴力算法进行优化
如果我们开若干个并查集,每次对于一条边,如果在\(1\)号并查集中它的两端所连接的点在一个连通块内,我们就在\(2\)号并查集中进行插入,以此类推...
通过上述算法,我们可以求出每一次操作后形成的生成森林
但是我们会发现,这个算法和原来相比,不仅时间复杂度没有改观,空间复杂度反而变得更劣了
但是这个算法的思想却有一定的启发性
我们可以发现一个性质:对于一条边,如果它可以在第\(i\)号并查集中插入,那么它也一定可以在\(i+1...n\)号并查集中插入
这个可以用反证法证明,也可以意会理解一下
发现了这个性质以后,我们就可以二分出第一个可以插入的并查集编号了
这样时间复杂度由\(O(MN)\)优化到了\(O(MlogM)\)
但是空间复杂度仍然无法承受
此时我们可以用哈希表优化空间
我们把若干个并查集排在一起,可以看做一个若干行\(n\)列的矩阵
把每个矩阵的坐标\((x,y)\)映射成某个数
在操作的过程中我们最多插入\(2M\)个不同的点
所以并查集只需要开\(O(2M)\)的空间即可
还有一个骚操作:用指针动态开点??!但是不太会用指针,就先咕着吧
代码
原文地址:https://www.cnblogs.com/VeniVidiVici/p/11432037.html
- hdu----(4308)Saving Princess claire_(搜索)
- spark2 sql读取数据源编程学习样例1
- golang的一个分页方法
- spark2 sql读取json文件的格式要求
- 容器化RDS|调度策略
- Go语言并发编程总结
- hdu------(4302)Holedox Eating(树状数组+二分)
- spark2的SparkSession思考与总结2:SparkSession有哪些函数及作用是什么
- GO语言并发编程之互斥锁、读写锁详解
- spark2.2 SparkSession思考与总结1
- 【译】Spring 官方教程:Spring Security 架构
- hdu----(4301)Divide Chocolate(状态打表)
- hdu------(4300)Clairewd’s message(kmp)
- TensorFlow ML cookbook 第一章7、8节 实现激活功能和使用数据源
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- k8s1.13.0二进制部署-Dashboard和coredns(五)
- kubernetes监控-prometheus(十六)
- kubernetes监控-Heapster+InfluxDB+Grafana(十五)
- centos7 安装mysql5.7
- ceph-简介及安装(luminous)版
- Activiti7 查询用户任务列表
- ansible自动化部署工具
- IDEA Activiti 画图中文乱码
- k8s集群部署高可用完整版
- kubenetes-rancher多集群管理(二十二)
- kubernetes-helm程序包管理器(二十)
- Activiti7 组任务
- kubeadm快速部署kubernetes(十九)
- prometheus-简介及安装
- 微服务治理istio