博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CF1095F】 Make It Connected(最小生成树)
阅读量:5254 次
发布时间:2019-06-14

本文共 1337 字,大约阅读时间需要 4 分钟。

如果没有特殊边的话显然答案就是权值最小的点向其他所有点连边。
所以把特殊边和权值最小的点向其他点连的边丢一起跑最小生成树就行了。

#include 
#include
using namespace std;const int MAXN = 200010;typedef long long ll;inline ll read(){ ll s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * w;}struct Edge{ int from, to; ll dis; int operator < (const Edge A) const{ return dis < A.dis; }}e[MAXN << 1];int n, m, pos;ll ans, w[MAXN], mn = 2147483647214748364ll;int f[MAXN];inline int find(int x){ return f[x] == x ? x : f[x] = find(f[x]);}int main(){ n = read(); m = read(); for(int i = 1; i <= n; ++i){ w[f[i] = i] = read(); if(w[i] < mn) mn = w[i], pos = i; } for(int i = 1; i <= m; ++i){ e[i].from = read(); e[i].to = read(); e[i].dis = read(); } for(int i = 1; i <= n; ++i) e[i + m] = (i == pos) ? (Edge){ 0, 0, 2147483647214748364ll } : (Edge){ i, pos, w[i] + w[pos] }; sort(e + 1, e + n + m + 1); for(int i = 1, k = n - 1; k; ++i) if(find(e[i].from) != find(e[i].to)) f[find(e[i].from)] = find(e[i].to), --k, ans += e[i].dis; printf("%lld\n", ans); return 0;}

转载于:https://www.cnblogs.com/Qihoo360/p/11272268.html

你可能感兴趣的文章
选择排序
查看>>
一个长度为10的数组,将数组按照冒泡排序法,进行排序。
查看>>
HDU - 3949 线性基应用
查看>>
CodeChef - RIN 最小割应用 规划问题
查看>>
设计模式之组合模式
查看>>
百度分享如何自定义分享url和内容?
查看>>
php抓取post方式提交的页面
查看>>
php简单缓存类
查看>>
文件中查找
查看>>
20145313张雪纯网络攻防第二次实验
查看>>
人人网JavaScript面试题
查看>>
Kontln的属性形式Getter和Setter
查看>>
win10 bcdedit加入vhdx启动
查看>>
Linux 黑白界面显示
查看>>
ActiveMQ学习系列(四)----消息持久化到mysql
查看>>
JavaScript设计模式基础之面向对象的JavaScript(一)
查看>>
RabbitMQ-从基础到实战(4)— 消息的交换(中)
查看>>
mysql 索引数据结构及原理
查看>>
01.Hibernate入门
查看>>
Ubuntu 16.0.4开启 log-bin
查看>>