79: cf 444E 并查集+思维
2024-10-21 16:02:09
$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 ;
}
最新文章
- Python文件读写
- jsdoc
- ORACLE 数据库 MOD 函数用法
- 浅谈Excel开发:一 Excel 开发概述
- aspcms标签
- SqlSever基础 dateadd year,增加五年
- jsPlumb 学习笔记
- tcp 和 udp 缓冲区的默认大小及设置【转】
- js实现移动端无限加载分页
- 关于 ioctl 的 FIONREAD 參数
- javaBean为什么要实现Serializable接口?
- 简单jquery 鼠标悬停提示效果
- web api 如何接收post过来的json字符串
- GridView获取单个单元格的值
- mui开发app前言(一)
- 江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告
- C语言函函数嵌套
- rocketmq广播消息
- 20165303魏煜第一周kali安装
- java中的Condition协作线程接口类