题意简述

\(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;
}

最新文章

  1. css3全屏背景图片切换特效
  2. Elasticsearch索引(company)_Centos下CURL增删改
  3. SPSS数据分析—聚类分析
  4. java规范(二)
  5. Unity3D UGUI学习系列索引(暂未完成)
  6. bootstrap弹出层效果
  7. (转载)Hadoop map reduce 过程获取环境变量
  8. web.py 学习(二)Worker
  9. Ubuntu搭建mysql,Navicat Premium连接
  10. MQTT Server搭建(apache-apollo)和MQtt Client搭建
  11. Lesson 2-1 (数据结构,序列通用的操作)
  12. alloc_page分配内存空间--Linux内存管理(十七)
  13. centos 7 一键安装gitlab
  14. windows mfc 程序,不同程序通信和互斥
  15. python的Web框架,Django模板标签及模板的继承
  16. Java 中的异常处理机制
  17. 查看是否安装.NET Framework、.NET Framework的版本号、CLR版本号
  18. Java - 复合模式优于继承
  19. Android Asynctask与Handler的比较,优缺点区别,Asynctask源码
  20. Applied Cloud Deep Semantic Recognition: Advanced Anomaly Detection(应用云深层语义识别:高级异态检测)

热门文章

  1. 【Weex笔记】-- Animate.css的使用
  2. XUtils 开发框架
  3. android的布局xml文件如何添加注释?
  4. 数组 indexOf()
  5. ajax自己封装
  6. Bugku的exec执行绕过
  7. 2021.11.10 fail树
  8. python安全脚本
  9. 今天遇到 Could not determine type for: java.util.List
  10. Python连接数据库,列表输出数据库中的某一列