qwq

关押罪犯

对于这种希望几个对象分开的题目,只要把并查集反过来想就可以了。

既然要求删除的边权最小,那么只要反过来求给定的点不连通时保留的边权最大即为正解。

同样的,首先将边权排序,不会使敌人连通则连接。

注意事项: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 逐个击破的更多相关文章

  1. 洛谷P2700 逐个击破

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...

  2. P2700逐个击破(并查集/树形dp)

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...

  3. 洛谷 P2700 逐个击破

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...

  4. P2700 逐个击破 最小生成树

    题目描述 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这 ...

  5. P2700 逐个击破

    题意:现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的, 现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这K ...

  6. 并查集【p2700】逐个击破

    题目描述-->p2700 逐个击破 题意概括 花费最小的代价,使得一些有标记的节点不连通. 分析 我们需要花费最小代价使得原来连通的图中一些节点之间不相互连通. 贪心显然是可行的(一点也不显然 ...

  7. tyvj P3737 逐个击破

    http://tyvj.cn/p/3737 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的 ...

  8. tyvj3737 逐个击破

    描述 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,mzd制定了先切断敌人东洒两头退路 ...

  9. 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)

    题目:输入某二叉树的前序遍历和中序遍历的结果.请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字. 比如:输入前序遍历 {1,2,4,7,3,5,6,8} 和中序遍历序列 {4,7 ...

随机推荐

  1. 【作业三】结队任务二-----CourseManagement

    031302517 031302319 ps:共同完成一篇随笔,文章中的第一人称我(517),队友(319) 一.功能分析+实现思路+结队讨论 这里我将功能分析和实现思路还有结对过程中的一些讨论结合在 ...

  2. Docker-compose 编排工具安装

    介绍 Compose 是一个定义和管理多容器的工具,使用Python语言编写,使用Compose配置文件描述多个容器应用的架构, 比如什么镜像,数据卷,网络,映射端口等:然后一条命令管理所有服务,比如 ...

  3. HTML命名规范

    一.关于选择器的命名   W3C CSS2.1的 4.1.3 节中提到:标识符(包括选择器中的元素名,类和ID)只能包含字符[a- zA-Z0-9]和ISO 10646字符编码U+00A1及以上,再加 ...

  4. 2018-01-04 浅尝The Little Prover一书, 重逢Chez Scheme

    书开篇之前说, 本书的目标的一个例子: 证明(reverse (reverse x))对于任何列表x, 结果总是x. (安装Chez Scheme的200字请看最后) 书刚开始, 就用到一个schem ...

  5. Docker第二章:docker基础1--镜像,容器&仓库

    镜像介绍及操作:http://www.haveneed.cn/article-detials/115 容器介绍及操作:http://www.haveneed.cn/article-detials/11 ...

  6. VirtualBox下安装CentOS7系统

    本文假定你已经知道如何安装VirtualBox虚拟机软件,并且已经安装好了. 首先我们需要准备好centos的iso镜像文件,可以从centos的官网下载. 以下操作使用的VirtualBox版本号是 ...

  7. 用U盘制作EXSI启动盘

    用U盘制作EXSI启动盘这是一个比较困难的事,一般的人会用UltraISO这个软件来制作.但是很遗憾,这样的方法很不好,我试了好几次都没有成功.主要是不能引导. 之后我换了一个刻录软件(rufus), ...

  8. Python参数传递(传值&传引用)

    # 测试参数是传值还是传引用def test(arg): print("test before") print(id(arg)) arg[1]=30 # 测试可变对象 # arg[ ...

  9. 将mssql数据库高版本迁移到低版本

    将mssql数据库高版本迁移到低版本 在低版本目标数据库中创建目标空数据库[TargetDb] ,注意新建数据库即可,不要创建任何表 在低版本数据库中,选中[服务器对象=>链接服务器] 右键[新 ...

  10. SQL PLUS的语句执行Commit

    oracle 中有个commit,是用来提交事务的.今天发现sql developer和sql plus的数据查询不一样. 如果我们对数据库进行增删改查,在提交sql语句之后,如果不点击commit, ...