题解 CF1095F 【Make It Connected】
题意简述
\(n\)( \(1≤n≤2×10^5\) )个点,每个点 \(i\) 有一个点权 \(a_i\) ( \(1≤a_i≤2×10^{12}\) ),将两个点 \(i\),\(j\) 直接相连的花费是两个点的点权和 \(a_i+a_j\),并且对于特别的\(m\)( \(1≤m≤2×10^5\) )条边 \(u_i\) , \(v_i\) 可以通过花费 \(w\) 点费用连接,求使得所有点互相连通的最小费用。
我们可以从数据范围看出需要注意的事项:
分析1.从\(n\)和\(m\)的范围可以看出我们最终的复杂度是带 log
的。
分析2.从\(a_i\),很显然需要 long long
。
接下来就从分析1导入正题。
Solution
看到关键词"连边","最小费用","边权"。
想到什么了?这不是我们可爱的最小生成树吗!
然后上来敲了一手 Kruskal(不会最小生成树可以点这里),然后越打越不对劲——是不是忘了点东西——还可以用 \(a_i+a_j\) 直接连边。
好,于是就用 \(O(n^2)\) 来加边....不对啊,这复杂度直接爆了。
真的 \(n^2\) 条边都要用吗?似乎不是的。
对于一个图最少需要连 \(n-1\) 条边来使图连通,我们只需要以权值最小的点作为核心,他连出来的那一组边是最小的,且是能使图连通的,我们只需找到权值最小的点,把它与其他点相连的费用计算出来并进行 Kruskal。所以总共只需 \(O(n+m)\) 加边即可
之后用最小生成树算法就可以了,复杂度约为 \(O((n+m)log(n+m))\)。
代码
那么代码如下:
#include<bits/stdc++.h>
using namespace std;
#define file(a) freopen(#a".in","r",stdin),freopen(#a".out","w",stdout);
int n,m,fa[200010],cnt,deals[200010];
long long v[200010],ans,minn=1000000000010,mid;
struct edge
{
int u,v;
long long w;
}q[500010];//记得开到两倍n
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%lld",&v[i]);
fa[i]=i;
if(v[i]<minn)
{
minn=v[i];
mid=i;
}
}
for(int i=1;i<=n;++i)
{
if(i==mid) continue;
q[i].u=mid;q[i].v=i;
q[i].w=v[mid]+v[i];
}
for(int i=n+1;i<=n+m;++i)
{
scanf("%d%d%lld",&q[i].u,&q[i].v,&q[i].w);
}
sort(q+1,q+1+n+m,cmp);
for(int i=1;i<=n+m;++i)
{
int x=find(q[i].u),y=find(q[i].v);
if(x!=y)
{
fa[y]=x;
ans+=q[i].w;
}
}
printf("%lld",ans);
return 0;
}
题解 CF1095F 【Make It Connected】的更多相关文章
- [CF1095F]Make It Connected
题目大意:给你$n(n\leqslant2\times10^5)$个点和$m(m\leqslant2\times10^5)$条边,第$i$个点点权为$a_i$.连接$u,v$两个点的代价为$a_u+a ...
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- POJ 1737 Connected Graph 题解(未完成)
Connected Graph Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3156 Accepted: 1533 D ...
- Educational Codeforces Round 37-E.Connected Components?题解
一.题目 二.题目链接 http://codeforces.com/contest/920/problem/E 三.题意 给定一个$N$和$M$.$N$表示有$N$个点,$M$表示,在一个$N$个点组 ...
- 【生成树,堆】【CF1095F】 Make It Connected
Description 给定 \(n\) 个点,每个点有点权,连结两个点花费的代价为两点的点权和.另外有 \(m\) 条特殊边,参数为 \(x,y,z\).意为如果你选择这条边,就可以花费 \(z\) ...
- 【CF1095F】 Make It Connected(最小生成树)
题目链接 如果没有特殊边的话显然答案就是权值最小的点向其他所有点连边. 所以把特殊边和权值最小的点向其他点连的边丢一起跑最小生成树就行了. #include <cstdio> #inclu ...
- Solution: 题解 CF1196E Connected Component on a Chessboard
感觉这题还可以 因为总空间比输入数量 不知高到哪里去了 ,所以完全不需要考虑放不下的问题 从贪心的角度考虑,如果要使相差数量巨大的\(b\)和\(w\)能够成功放下来,应该使这些方块尽量分散(似乎有点 ...
- [题解]codevs1001 舒适的路线
h3 { font-family: Consolas; color: #339966 } .math { font-family: Consolas; color: gray } 题目描述 Descr ...
- codeforces CF475 ABC 题解
Bayan 2015 Contest Warm Up http://codeforces.com/contest/475 A - Bayan Bus B - Strongly Connected Ci ...
随机推荐
- js读取cookie 根据cookie名称获取值的方法
//方法1 //存在问题:如果cookie中存在 aaaname=aa;name=bb 获取name的值就会出现错误function getCookie(c_name){ if (document.c ...
- Wireshark-过滤器-数据包解析
目录 过滤器 数据包解析 参考 推荐阅读: https://www.cnblogs.com/zwtblog/tag/计算机网络/ 过滤器 显示过滤器 和 捕获过滤器,俩者使用非常类似. 在Wiresh ...
- BootstrapBlazor 使用模板创建项目
原文连接:https://www.cnblogs.com/ysmc/p/16101157.html BootstrapBlazor 官网地址:https://www.blazor.zone Boots ...
- 「实践篇」解决微前端 single-spa 项目中 Vue 和 React 路由跳转问题
前言 本文介绍的是在做微前端 single-spa 项目过程中,遇到的 Vue 子应用和 React 子应用互相跳转路由时遇到的问题. 项目情况:single-spa 项目,基座用的是 React,目 ...
- 正则表达式小技巧,sql中in的字符串处理
工作中我经常写sql,当写带in的语句时,需要敲好多单引号,逗号,敲写起来容易易出错.因此,我写了一个小工具,处理这种繁琐工作.原理简单,利用正则表达式匹配.替换. 先看界面,一个html页面,包含三 ...
- 2021.07.18 P2290 树的计数(prufer序列、组合数学)
2021.07.18 P2290 树的计数(prufer序列.组合数学) [P2290 HNOI2004]树的计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.pru ...
- java第十二周作业
1.定义一个点类Point, 包含2个成员变量x.y分别表示x和y坐标,2个构造器Point()和Point( intx0,y0),以及一个movePoint (int dx,intdy)方法实现点的 ...
- Docker安装 Ubuntu Centos
Ubuntu 安装Dokcer 1. 删除旧版本Docker安装包和依赖项 sudo apt-get remove docker docker-engine docker.io containerd ...
- 项目依赖模块解决、二次封装Response、后台数据库配置、user模块user表设计、前台创建及配置
今日内容概要 二次封装Response 后台数据库配置 user模块user表设计 前台创建及配置 内容详细 补充--项目依赖模块 # 导出项目依赖模块和安装项目依赖模块 第三方模块--->导出 ...
- MKL库矩阵乘法
此示例是利用Intel 的MKL库函数计算矩阵的乘法,目标为:\(C=\alpha*A*B+\beta*C\),由函数cblas_dgemm实现: 其中\(A\)为\(m\times k\)维矩阵,\ ...