Luogu P2700 逐个击破
同关押罪犯
对于这种希望几个对象分开的题目,只要把并查集反过来想就可以了。
既然要求删除的边权最小,那么只要反过来求给定的点不连通时保留的边权最大即为正解。
同样的,首先将边权排序,不会使敌人连通则连接。
注意事项:1.初始化 2.最后的答案要定义为long long
bin哥今天讲的:
当加入一条边时,它连接的点只有两种情况:
1.都被占领,这时不能连接;
2.其中一个被占领,需要把另一个也标记为已占领(其实只要把父节点标记就可以了,所以只有(子 & !父)的情况下需要修改);
3.都未被占领,连接也无影响,不需要操作。
所以我原来写的:
if(col[xx] && col[yy] && (col[xx]!=col[yy]))continue;
if(col[yy])col[xx] = col[yy];
fa[yy] = xx;
......
就是用染色的方式记录是否连接到敌人。(不知道为什么错了quq)
不过对于这道题,边数为n-1(是一棵树),则一定不会出现环,所以不需要判断连接到的敌人是否是同一个地方,
只要判断有没有占领就行了(占领则一定不同)。
用bool代替int:
if(col[xx] && col[yy])continue;
if(col[yy])col[xx] = true;
代码如下
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn = ;
int fa[maxn];
bool col[maxn];
int n,k,p;
long long sum; struct xyw {
int x,y,w;
}g[maxn]; int getfa(int x){
if(fa[x] == x)return x;
else return fa[x] = getfa(fa[x]);
} bool cmp(xyw i,xyw j){
return i.w > j.w;
} int main() {
scanf("%d%d",&n,&k);
for(int i = ;i <= n;i++)
fa[i] = i;
for(int i = ;i <= k;i++){
scanf("%d",&p);
col[p] = true;
}
for(int i = ;i <= n-;i++){
scanf("%d%d%d",&g[i].x,&g[i].y,&g[i].w);
sum += g[i].w;
}
sort(g+,g+n,cmp);
for(int i = ;i <= n-;i++){
int xx = getfa(g[i].x);
int yy = getfa(g[i].y);
if(col[xx] && col[yy])continue;
if(col[yy])col[xx] = true;
fa[yy] = xx;
sum -= g[i].w;
}
printf("%lld",sum);
return ;
}
Luogu P2700 逐个击破的更多相关文章
- 洛谷P2700 逐个击破
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...
- P2700逐个击破(并查集/树形dp)
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...
- 洛谷 P2700 逐个击破
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...
- P2700 逐个击破 最小生成树
题目描述 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这 ...
- P2700 逐个击破
题意:现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的, 现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这K ...
- 并查集【p2700】逐个击破
题目描述-->p2700 逐个击破 题意概括 花费最小的代价,使得一些有标记的节点不连通. 分析 我们需要花费最小代价使得原来连通的图中一些节点之间不相互连通. 贪心显然是可行的(一点也不显然 ...
- tyvj P3737 逐个击破
http://tyvj.cn/p/3737 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的 ...
- tyvj3737 逐个击破
描述 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,mzd制定了先切断敌人东洒两头退路 ...
- 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)
题目:输入某二叉树的前序遍历和中序遍历的结果.请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如:输入前序遍历 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7 ...
随机推荐
- Archlinux/Manjaro使用笔记-报错:一个或多个 PGP 签名无法校验!的解决方法
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 解决办法:添加无法校验的pgp签名为信任 gpg --recv-keys xxxxxx xxxxxx为无法校验的gpg值
- CSS之设置滚动条样式
因为在现在的大部分项目中很多都用到了滚动条,有时候用到模拟的滚动条,现在说下滚动条的CSS也能解决. 比如网易邮箱的滚动条样子很好看,就是利用的CSS来设置的,而且是webkit浏览器的.如图所示: ...
- webpack单独打包一个less文件
需要将btn.less文件用webpack打包后,放到项目中.在网上百度了各种,遇到了很多问题,现在我将整个步骤整理如下: 1.建一个空的文件夹,命名为init_webpack,在该文件夹下运行: 这 ...
- Linux 改动inittab文件及忘记密码等导致无法进入系统的解决办法
改动inittab文件及忘记密码等导致无法进入系统的解决办法[摘] by:授客 QQ:1033553122 inittab是linux的系统启动模式配置文件,在”/etc“文件目录下没,其内容是: # ...
- Universal-ImageLoader,Picasso,Fresco,Glide对比
Universal-ImageLoader:(估计由于HttpClient被Google放弃,作者就放弃维护这个框架)优点:1.支持下载进度监听2.可以在 View 滚动中暂停图片加载,通过 Paus ...
- 修改Devexpress DateEdit控件默认的日期格式和日历风格
最近项目中很多地方使用到DevExpress的DateEdit控件,而且设置都是一致(日期格式.选择日期的日历的风格等).每一次都需要设置太痛苦,因此需要寻找一种高效的解决方式. 一. 设置好一个作为 ...
- 扩展BootstapTable支持TreeGrid
(function ($) { 'use strict'; var sprintf = function (str) { var args = arguments, flag = true, i = ...
- VSCode + PYQT5 + QtDesigner 环境搭建和测试
目的:编写Python桌面应用程序. 备注:也可以选择VS2017+QtDesigner ,但更喜欢VSCode 第1步:安装PyQt5和PyQt5-tools pip3 install -i htt ...
- tkinter学习系列之(八) Canvas控件
目录 目录 前言 (一)carves创建方法 (二)carves的画图方法 目录 前言 由于最近想在tkinter里内嵌matplotlib,由于用到tkinter里的carves控件,先学习一下. ...
- Mysqli面向对象操作数据库
Mysqli面向对象操作数据库 首先配置一下数据库: 接着用PHP中的Mysqli扩展库面向对象查询这个数据表. 操作分为以下几个步骤: 连接数据库 操作数据库 处理结果 关闭资源 <?php ...