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 ...
随机推荐
- setTimeout.js
var cyn = function(){ console.log("我是延时输出的函数") } setTimeout(cyn,5000)
- Django Rest framework 之 节流
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- HTML5本地存储localStorage与sessionStorage详解
前言 在最近的项目中用到了html5的本地存储,下面总结一下. 1.html5几种存储形式 本地存储(localStorage && sessionStorage) 离线缓存(appl ...
- Visual Studio 2015速递(4)——高级特性之移动开发
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- JavaScript与正则表达式
正则表达式的定义 正则表达式与字符串对象相关的方法 相关示例 一.正则表达式(regular expression简称res) 1.定义: 一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成 ...
- Linux 学习笔记之超详细基础linux命令 Part 7
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 6----------------- ...
- 【详细】【转】CentOS 7部署ASP.NET Core应用程序
很早就看过关于net core部署在Linux上的文章,自己也曾亲自将项目部署在Linux上,今天看到这篇文章,为其格式之工整而转! 1.环境准备 网上看了一下,Linux云服务器还挺贵的,那就只好先 ...
- 位运算符&与、或|、异或^
&按照二进制位进行运算 如:运算规则:0&0=0: 0&1=0:1&0=0:1&1=1:即:两位同时为“1”,结果才为“1”,否则为0[有0则0] 3& ...
- CSS网页菜单
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserContro ...
- 上下文管理器——with语句的实现
前言 with语句的使用给我们带来了很多的便利,最常用的可能就是关闭一个文件,释放一把锁. 既然with语句这么好用,那我也想让我自己写的代码也能够使用with语句,该怎么实现? 下面具体介绍怎样实现 ...