并查集缩点这个trick感觉明明用得很广泛,为什么以前都不知道……

先把$m$条线路从小到大排个序,这样可以保证之前合并出来的一定是最小的,大的代价不会把小的覆盖掉。

维护两个并查集,一个用来缩点,另一个用来维护生成树的相关信息

直接把每一条树链合并到lca处,最后再把两个lca合并,因为最后要把两个lca合并,所以求lca拆开跳链的做法比较优秀。

链剖求lca还真的比倍增常数小

感觉get了很多。

Code:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;const int N = 1e5 + 5;
const int Lg = 20;int n, m, tot = 0, head[N], ufs[N];
int fa[N][Lg], same[N], dep[N], siz[N];
ll cost[N];struct Edge {int to, nxt;
} e[N << 1];inline void add(int from, int to) {e[++tot].to = to;e[tot].nxt = head[from];head[from] = tot;
}struct Lineway {int u1, v1, u2, v2;ll cost;
} a[N];bool cmp(const Lineway &x, const Lineway &y) {return x.cost < y.cost;
}template <typename T>
inline void read(T &X) {X = 0;char ch = 0;T op = 1;for(; ch > '9'|| ch < '0'; ch = getchar())if(ch == '-') op = -1;for(; ch >= '0' && ch <= '9'; ch = getchar())X = (X << 3) + (X << 1) + ch - 48;X *= op;
}inline void swap(int &x, int &y) {int t = x;x = y;y = t;
}void dfs(int x, int fat, int depth) {fa[x][0] = fat, dep[x] = depth;for(int i = 1; i <= 18; i++)fa[x][i] = fa[fa[x][i - 1]][i - 1];for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(y == fat) continue;dfs(y, x, depth + 1);}
}inline int getLca(int x, int y) {if(dep[x] < dep[y]) swap(x, y);for(int i = 18; i >= 0; i--)if(dep[fa[x][i]] >= dep[y])x = fa[x][i];if(x == y) return x;for(int i = 18; i >= 0; i--)if(fa[x][i] != fa[y][i])    x = fa[x][i], y = fa[y][i];return fa[x][0];
}inline void init() {for(int i = 1; i <= n; i++)same[i] = i, ufs[i] = i, siz[i] = 1, cost[i] = 0LL;
}int find(int x) {return ufs[x] == x ? x : ufs[x] = find(ufs[x]);
}int findSame(int x) {return same[x] == x ? x : same[x] = findSame(same[x]);
}inline void merge(int x, int y, ll c) {int fx = find(x), fy = find(y);if(fx == fy) return;ufs[fx] = fy;siz[fy] += siz[fx];cost[fy] += cost[fx] + c;
}inline void go(int x, int y, ll c) {for(; ; ) {x = findSame(x);if(dep[x] <= dep[y]) return;merge(x, fa[x][0], c);same[x] = fa[x][0];}
}inline void chain(int x, int y, ll c) {int z = getLca(x, y);go(x, z, c), go(y, z, c);
}int main() {read(n), read(m);for(int x, y, i = 1; i < n; i++) {read(x), read(y);add(x, y), add(y, x);}dfs(1, 0, 1);for(int i = 1; i <= m; i++)read(a[i].u1), read(a[i].v1), read(a[i].u2), read(a[i].v2), read(a[i].cost);sort(a + 1, a + 1 + m, cmp);init();for(int i = 1; i <= m; i++) {chain(a[i].u1, a[i].v1, a[i].cost);chain(a[i].u2, a[i].v2, a[i].cost);merge(a[i].u1, a[i].u2, a[i].cost);}int ans = find(1);printf("%d %lld\n", siz[ans], cost[ans]);return 0;
}

View Code

转载于:https://www.cnblogs.com/CzxingcHen/p/9501566.html

WOJ 43 电话邀请相关推荐

  1. 终于也为自己开了技术博客

    虽然现在自己离技术有点远了 但是现在已经在开始慢慢把自己拉回技术的位置了 以后呢 我会把自己学习的东西都记录在这里 以便督促自己学习进展和回顾自己的学习知识 下面先介绍下自己的情况吧 计算机专业 20 ...

  2. [面经]春季跳槽面筋总结 [2018年3月17]

    春季跳槽面筋总结 人人都说金三银四,由于一些个人的原因,博主也在今年的三月份抽空面了几家公司,这里来总结下学习到的东西. 先简单的说下博主的情况: 2015年7月份毕业,到现在加上实习可以算三年工作经 ...

  3. 名校教授:把研究生扔到河里,游过去的就成为博士

    普林斯顿大学数学系和普林斯顿高等研究院数学部,在20世纪30和40年代迅速成为美国学术界冉冉上升的明星,不仅在拓扑学.代数学和数论方面独占鳌头,也在计算机理论.运筹学和新生的博弈论处于领先地位. &g ...

  4. 【其他】程序员装修指南

    你背井离乡摸爬滚打多年,搬了无数次家,受够了各种各样的房东的各种各样的苛刻与挑剔,好不容易凑够了买房的首付,想着即将拥有一个可以安身立命之所以及心灵栖息之港,满心愉悦地告慰自己道再苦再累也值了.预期快 ...

  5. 转载:一名程序员的磨练

    以下博文转载自http://www.cnblogs.com/Tpf386/p/4798437.html,作者是荆棘人.博文描述了他成为程序员的磨练!祝他顺利,也祝各位读者顺利! .net程序员工作两年 ...

  6. 深圳IT外包公司名单汇总

    鉴别指南: ①.如果电话邀请面试的时候对方问到了学历,做过哪些项目,用过哪些技术等问题,99%是外包公司(且是外派形式),因为外包公司负责招聘的工作人员从来不会认真去阅读你的简历,只要发现你的简历更新 ...

  7. 过于自信,面试普通Java岗被面试官吊打了。。。

    是的,诸位没有看错,这篇文章的要讲述的并不是我吊打面试官,而是一段我被面试官吊打的陈年往事,这段痛苦的记忆在我脑海中长久不衰,也是一个我内心曾多次不愿面对的事实,各位看官可以准备好一小把瓜子,听我将这 ...

  8. 国内IT软件外包公司汇总(2023 最新版)!

    大环境不行,面试太少了,很多本科生想进外包都没机会.非常时期,不需要在意那么多,外包作为过渡也是没问题的,很多外包其实比小公司还要好多了. 也不要太担心去外包会污染自己的简历,只要接触的项目还可以,写 ...

  9. 2023养生健康品牌连锁加盟展/医养健康产业展/山东大健康展

    5月全年招商季,China-DJK山东健博会再铸2023年度大健康行业唯具参展价值的盛会: 五月再启征程:每年的五月正是企业招商的好时节,中国(济南)国际大健康产业博览会China (Jinan) I ...

最新文章

  1. linux 常用命令集
  2. 如何根据CSD寄存器计算SD卡容量(csd v1.0 csd v2.0)
  3. boost::mpl模块实现vector_c相关的测试程序
  4. linux 路由表_Linux 容器网络笔记:underlay
  5. Hyper-v 虚拟机使用NAT方式连接网络
  6. 属于 Hadoop 的大数据时代已结束
  7. jQuery基础——选择器
  8. 如何能够做好主动沟通
  9. freemarker生成简单模板
  10. 3.4 常用数据类型的输入 [原创Excel教程]
  11. MVC3.0 开发过程中遇到错误及解决方案(不断更新中。。。)
  12. VirtualBox成功安装Ubuntu18.04设置共享文件夹总结
  13. 昆明oracle考试点,Oracle认证考试知识点:修改sid的步骤
  14. matlab画sinc函数及其有意思的性质
  15. 密码学系列 - 椭圆曲线 ECC - ED25519
  16. SourceTree提交vue前端代码报错git -c diff.mnemonicprefix=false -c core.quotepath=false commit -q -F C:\Users\
  17. python中ipo模式是什么意思呢_Python 之 简单的IPO模式
  18. 元宇宙,只是一时兴起的想法?
  19. 如何添加JavaScript代码
  20. 孕妇吃米饭好吗?盘点适合孕妇吃的美食

热门文章

  1. 【转】ionic run android 成功launch success,但是genymotion虚拟机没有显示
  2. centos7下安装mariadb
  3. JavaEE Tutorials (24) - 资源适配器示例
  4. 嵌入式开发之davinci--- 8168 电源调试总结
  5. 【BZOJ】1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(dp/线段树)
  6. 【Python学习系列五】Python网络爬虫框架Scrapy环境搭建
  7. Java实现算法导论中Miller-Rabin随机性素数测试
  8. windows下部署redis
  9. 应用adb发布apk到android avd模拟器
  10. Leetcode 117. 填充每个节点的下一个右侧节点指针 II 解题思路及C++实现