并查集【p2700】逐个击破
题目描述-->p2700 逐个击破
题意概括
花费最小的代价,使得一些有标记的节点不连通.
分析
我们需要花费最小代价使得原来连通的图中一些节点之间不相互连通.
贪心显然是可行的(一点也不显然
看到其他人写了dp,写了贪心.
但我感觉可以排序+并查集做啊.
排序
考虑我们要花费最小代价删边,但是并查集不支持删除操作.
(貌似有一种东西叫分治线段树可以维护这种操作.
因此,我们根据容斥原理(这玩意是叫容斥吧.
花费最小代价删边,等价于花最大代价建边,最后剩下不建的边,就是我们的答案.
所以说,我们需要按照边权从大到小建图。sort!
我们需要保证的是两个敌人节点不互相连通.
这就是我们并查集的作用!
并查集
首先明确:
并查集要初始化,一定要初始化!
下面的图中,红色代表敌人节点,绿色代表我方节点.
如果某两个节点是我们的敌人节点,我们一定不会去建边.(为虎作伥? 像这样↓.
如果你连接,那你就违背了题目要求,你也不是一个
秉承伟大军事家的战略思想,一个有智慧的军长了
还有,如果我们已经将敌人包围建出下面这样的图这时,还有一个敌人节点.↓
如果我们连接某一个我方节点,不连接敌方节点,那敌人也会互相连接(翻过屋后的山
所以说我们需要考虑一下如何解决这种情况.
如果,我方节点已经连接了敌方节点,则需要标记我方节点,使得敌方节点无法通过我方节点连接敌方节点.
因此说,我们可以把连接到敌人节点的我方节点变成敌人节点.
从而使得其他敌人节点与其无法连接.
那我们上面的图就变成这样↓
这样我们的程序就可以实现我们所想了.
最后我们会将边权大的边加入到并查集中.
则最后没有加入到并查集中的点,就会是被孤立的敌方节点.
所以我们把总边权减去我们加入到图中的边权就是我们的ans啦!
关于样例
样例建的原图↓
最终是这样的↓
因此我们在样例的答案是4.
--------------------代码---------------------
#include<bits/stdc++.h>
#define IL inline
#define RI register int
IL void in(int &x)
{
int f=1;x=0;char s=getchar();
while(s>'9' or s<'0'){if(s=='-')f=-1;s=getchar();}
while(s>='0' and s<='9'){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,k,f[100008],tot;
bool init[1000008];
long long ans;
struct cod{int u,v,w;}edge[100008];
IL int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
IL bool ccp(const cod&a,const cod&b){return a.w>b.w;}
int main(void)
{
in(n),in(k);
for(RI i=1;i<=n;i++)f[i]=i;//一定要初始化!
for(RI i=1,x;i<=k;i++)in(x),init[x]=true;
for(RI i=1;i<=n-1;i++)
in(edge[i].u),in(edge[i].v),in(edge[i].w),ans+=edge[i].w;
std::sort(edge+1,edge+n,ccp);//从大到小sort.
for(RI i=1;i<=n-1;i++)
{
int u=edge[i].u,v=edge[i].v,w=edge[i].w;
int fu=find(u),fv=find(v);
if(init[fu] and init[fv])continue;
f[fu]=fv;
ans-=w;//减去边
if(init[fu])init[fv]=true;
else if(init[fv])init[fu]=true;
}
printf("%lld",ans);
}
并查集【p2700】逐个击破的更多相关文章
- P2700逐个击破(并查集/树形dp)
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...
- 洛谷P2700 逐个击破
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...
- 洛谷 P2700 逐个击破
P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,毛主席制 ...
- Luogu P2700 逐个击破
qwq 同关押罪犯 对于这种希望几个对象分开的题目,只要把并查集反过来想就可以了. 既然要求删除的边权最小,那么只要反过来求给定的点不连通时保留的边权最大即为正解. 同样的,首先将边权排序,不会使敌人 ...
- P2700 逐个击破 最小生成树
题目描述 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这 ...
- P2700 逐个击破
题意:现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的, 现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这K ...
- LuoguP2700逐个击破【并查集/生成树/正难则反】By cellur925
题目传送门 题目大意:给你一棵树,求把其中k个点相互隔离(不连通)所需要的边权代价. 这题我开始是想要求出把k个点联通的最小代价的,但后来发现还是实现起来比较困难,题解里貌似也没有这种做法,于是就鸽了 ...
- 【题解】逐个击破 luogu2700
题目 题目描述: 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的. 现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少 ...
- HDU 4496 D-City(并查集,逆思维)
题目 熟能生巧...常做这类题,就不会忘记他的思路了... //可以反过来用并查集,还是逐个加边,但是反过来输出...我是白痴.....又没想到 //G++能过,C++却wa,这个也好奇怪呀... # ...
随机推荐
- BZOJ day2_plus
大半夜的刷b站,好爽啊... 突破十九题 1008105110591088117911911192143218761951196821402242243824562463276128184720
- 【BZOJ 2503】相框 图论+讨论
这道题目就是考验了一下图论基本知识与对可爱的代码实现的应对能力. 我们先分析题干信息.我们要形成相框,那么所有的点的度为2(参与的点),那么所有度大于2的点都需要熔断,而且一次完成所有关于这个点的熔断 ...
- 设计一个JavaScript框架需要编写哪些模块
在这个js框架随处乱跑的时代,你是否考虑过写一个自己的框架?下面的内容也许会有点帮助. 一个框架应该包含哪些内容? 1. 语言扩展 大部分现有的框架都提供了这部分内容,语言扩展应当是以ECMAScri ...
- 关于 WizTools.org RESTClient的使用
今天分享一个很好用的测试service的工具,很好用 提供两种方法使用这个东东. 第一种方法 通过cmd命令窗口. (1)cd C:\Users\li_weifeng\Desktop\c4d2(文件存 ...
- Spring中Resource接口的前缀书写格式
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt"); //这个 ...
- Java多线程调试如何完成信息输出处理
转载自:http://developer.51cto.com/art/201003/189078.htm Java多线程调试是很繁琐的,但是还是需要我们不断进行相关的学习.下面我们就来看看在Java多 ...
- Hibernate 三种状态变化 与 sql 语句的关系
前言:在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的.对于理解hibernate,JVM和sql的关系有更好的 ...
- [BZOJ1036][ZJOI2008]树的统计Count 解题报告|树链剖分
树链剖分 简单来说就是数据结构在树上的应用.常用的为线段树splay等.(可现在splay还不会敲囧) 重链剖分: 将树上的边分成轻链和重链. 重边为每个节点到它子树最大的儿子的边,其余为轻边. 设( ...
- [POJ2406&POJ1961]用KMP解决字符串的循环问题两例
翻阅了一下网上资料,发现大部分都说这题是找规律...或是说YY出的一个算法..不会证明... 然后就脑补了一下证明 ~ 结论:对于一个字符串S[1..N],如果N mod (N-next[N])=0 ...
- DWM.EXE进程(Desktop Window Manager)不能删除
英文全拼:Desktop Window Manager(DWM) 进程描述:桌面窗口管理器文件位置:C:\Windows\System32进程简介:桌面窗口管理器是windows Vista及wind ...