$des$

题面

$sol$

把边从小到大排序,枚举每条边作为答案,然后把两个点合并,
判断每条边是否可以作为答案时,
$cnt_i$ 表示节点 $i$ 已经合并的 $x$ 之和
$size_i$ 表示已经合并的节点的个数
$sum = \sum x$
将 $a$ 与外面的点合并时
判断条件 $size_a <= sum - cnt_a$
并查集维护。

$code$

#include <bits/stdc++.h>

using namespace std;

#define Rep(i, a, b) for(int i = a; i <= b; i ++)

#define gc getchar()
inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} const int N = 1e5 + ; int n, Cnt[N], Size[N], fa[N], Sum;
struct Node {
int u, v, w;
bool operator < (Node a) const {
return this->w < a.w;
}
} G[N];
bool Ok; int Get(int x) {
return fa[x] == x ? x : fa[x] = Get(fa[x]);
} void Merge(int x, int y) {
x = Get(x), y = Get(y);
Size[x] += Size[y];
Cnt[x] += Cnt[y];
fa[y] = x;
if(Size[x] > Sum - Cnt[x]) Ok = ;
} int main() {
n = read();
Rep(i, , n - ) G[i] = (Node) {
read(), read(), read()
};
sort(G + , G + n);
Rep(i, , n) Cnt[i] = read(), Sum += Cnt[i];
Rep(i, , n) fa[i] = i, Size[i] = ;
int Answer = ;
Ok = ;
Rep(i, , n - ) {
if(Ok) Answer = G[i].w;
Merge(G[i].u, G[i].v);
}
cout << Answer;
return ;
}

最新文章

  1. Python文件读写
  2. jsdoc
  3. ORACLE 数据库 MOD 函数用法
  4. 浅谈Excel开发:一 Excel 开发概述
  5. aspcms标签
  6. SqlSever基础 dateadd year,增加五年
  7. jsPlumb 学习笔记
  8. tcp 和 udp 缓冲区的默认大小及设置【转】
  9. js实现移动端无限加载分页
  10. 关于 ioctl 的 FIONREAD 參数
  11. javaBean为什么要实现Serializable接口?
  12. 简单jquery 鼠标悬停提示效果
  13. web api 如何接收post过来的json字符串
  14. GridView获取单个单元格的值
  15. mui开发app前言(一)
  16. 江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告
  17. C语言函函数嵌套
  18. rocketmq广播消息
  19. 20165303魏煜第一周kali安装
  20. java中的Condition协作线程接口类

热门文章

  1. Scala 系列(一)—— Scala 简介及开发环境配置
  2. ServletContextInitializer添加 servlet filter listener
  3. CentOS7配置网卡上网、安装wget、配置163yum源
  4. C# vb .net实现棕褐色效果特效滤镜
  5. c# js 时间
  6. 使用poi统计工作职责
  7. TCP三次握手四次挥手介绍
  8. MES选型很困惑?避开这三个禁忌!
  9. H3C Short GI
  10. 常用docker管理UI