P2700 逐个击破 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

也就是让k个节点互不连通,很容易知道要产生这种情况,就必须将原图划分为k个互相独立的联通块,且每个联通块有且仅有一个k之一的节点。

所以可以用并查集,每个联通块的祖先节点为一个被占领的城市。然后重新建图,删去最少价值的边也就意味着建最大价值的图,所以对边从大到小排序,然后并查集判断如果两个节点的祖先是否为被占领的城市。

struct edge {int from, to, val;int operator<(edge b)const {return val > b.val;}
}edg[N];
vector<edge>gra[N];
vector<int>in(N);
vector<int>pre(N);
void init(int n) {rep(j, 1, n)pre[j] = j;
}
int fnd(int k) {return pre[k] == k ? k : pre[k] = fnd(pre[k]);
}
signed main()
{ios::sync_with_stdio(0); cout.tie(0);
#ifndef ONLINE_JUDGE//freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endifinln(n, k);int sum = 0, ans = 0;init(n);rep(j, 1, k) {cin >> m;m++;in[m] = 1;}rep(j, 1, n - 1) {int f, t, v;inln(f, t, v);f++; t++;edg[j] = { f,t,v };ans += v;}sort(edg + 1, edg + 1 + n - 1);rep(j, 1, n - 1) {auto [f, t, v] = edg[j];int t1 = fnd(f), t2 = fnd(t);if (in[t1] and in[t2]) {continue;}if (in[t1])pre[t2] = t1;//一个被占领的城市合并一个普通边else pre[t1] = t2;ans -= v;}pln(ans);return 0;
}

P2700 逐个击破 并查集/生成树相关推荐

  1. 洛谷 P2700逐个击破 题解 C++

    洛谷 P2700逐个击破 题解 C++ 文章目录 洛谷 P2700逐个击破 题解 C++ 题目大意 思路 贪心证明 详细做法 代码 样例 题目大意 给定N个点的一棵树以及N-1条无向边和该边的销毁代价 ...

  2. 洛谷:P2700 逐个击破(最大生成树、贪心)

    先断退路,逐个歼灭 题意: 很清晰,不再赘述 思路: 一眼看过去,显然可以发现很多性质: 若一条边两点(连通块)都存在军团,显然这条边会被算入结果 若一条边两点都不存在军团,显然可以通过缩点维护一个 ...

  3. P2700 逐个击破

    一开始以为题很难,当我坐下来认真读题后,却神奇地发现这道题很水-- 这和Kruskal有什么区别啊? 于是我开开心心地十五分种敲完了代码~ 然后我就Wa了-- emmm-- 尴尬-- 一开始我对于每一 ...

  4. luogu P2700 逐个击破

    嘟嘟嘟 这道题只要树形dp做的熟练的话就能秒(显然我不能). 令dp[u][0 / 1]表示u所在的子树和u相连的联通块没有/有敌人的最少代价.而且按题中所述,这个联通块只能有1个敌人. 分情况: 若 ...

  5. 【ybtoj 高效进阶 3.1】 【并查集】 逐个击破

    [ybtoj 高效进阶 3.1] [并查集] 逐个击破 题目 解题思路 换一个思路 求出保留的边 用总边权减去保留的 能被保留下来的边的两个端点不能都被k军团占领 我们要做的就是维护每个连通块 有被占 ...

  6. 【模板/经典题型】并查集维护生成树

    这里的并查集是按秩合并并查集. 这种方法维护生成树的时候可以维护一个点到根的权值. 但是由于合并的时候做了一个类似换根一样的操作,因此这个权值通常只能是异或之类的. //find-union-set ...

  7. 货车运输 vijos 1843 NOIP2013 D1T3 最大生成树,并查集,(伪·LCA)

    (本人比较笨,没写LCA,在树上暴力跑过了此题.) 可以证明答案一定在最大生成树上,因为如果答案比最大生成树上的路径更优,那么最大生成树一定不是正确的.反证之. 同时注意到最大生成树过程中是使用了并查 ...

  8. HDU 4786 生成树 并查集+极大极小值 黑白边 确定选择白边的数量

    题意: 给定一个无向图 n 个点 m条无向边 u v val val == 1 表示边(u, v) 为白边 问能否找到n个点的生成树, 使得白边数为斐波那契数 思路: 并查集求图是否连通( 是否存在生 ...

  9. nssl1191,P2700-逐个击破(平津战役)【并查集】

    正题 题目大意 一棵树n个点 有k个点被占领,删除每一条边都有不同的代价,然后要求所以被占领的点相互隔开,代价最小. 解题思路 我们可以考虑反构图,将边权排序,然后对于每条边,如果加入这条边后不会使敌 ...

最新文章

  1. GAUSSIAN MIXTURE VAE: LESSONS IN VARIATIONAL INFERENCE, GENERATIVE MODELS, AND DEEP NETS
  2. git初使用(本地创建后第一次提交到git)
  3. python 多线程入门试验
  4. SpringBoot上传文件到本服务器 目录与jar包同级
  5. Identity Server4学习系列四之用户名密码获得访问令牌
  6. Android中libs目录下armeabi和armeabi-v7a的区别
  7. c++ tcp 封装_关于TCP三次握手和四次挥手问题,求你别再问了问了...
  8. 单片机和opencv_OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点...
  9. c语言编写打字母游戏代码,求一个用C语言编写的小游戏代码
  10. 华云天下荣膺“2021年度十佳呼叫中心硬件及软件设备供应商”
  11. java netbean_java NetBean创建及各菜单项相对应的窗体及布局教程.pdf
  12. 十款代码表白特效,一个比一个浪漫
  13. iOS 13 SceneDelegate适配
  14. 计算机专业总人数所占比例公式,excel统计数据所占比例的教程详解
  15. 基于arm-linux-gcc版本,音乐视频播放器mplayer
  16. 如何4步绘制出高水平的气泡图?
  17. 专家解答 揭密IBM Power LC系统
  18. 解决:Notepad++搜索不到(无法安装)Finger Text插件
  19. StringBuilder 拼接去掉最后一个逗号
  20. DDN周报|3月26日-4月1日

热门文章

  1. sklean中自带的数据集
  2. idea中项目如何关闭
  3. 网站seo优化之如何建立网站长尾关键词库?
  4. 分布式事务——Saga实现思路
  5. 分析了300多个文案类型总结的内容写作技巧
  6. 蓝牙远程打卡java_Android基于ibeacon实现蓝牙考勤功能
  7. java h265,H264/H265码流的编码码率设置
  8. 【matlab】实验四:数据可视化+matlab绘图
  9. 正则匹配多个键值对英文逗号连接
  10. 如何提供一种热电偶滑环装置