题目背景

三大战役的平津战场上,傅作义集团在以北平、天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜。为了就地歼敌不让其逃走,毛主席制定了先切断敌人东西两头退路然后再逐个歼灭敌人的战略方针。秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的战场局面。

题目描述

现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这K个地方军团互相隔离开,以便第二步逐个击破敌人。

输入输出格式

输入格式:

第一行包含两个正整数n和k。

第二行包含k个整数,表示哪个城市别敌军占领。

接下来n-1行,每行包含三个正整数a,b,c,表示从a城市到b城市有一条公路,以及破坏的代价c。城市的编号从0开始。

输出格式:

输出一行一个整数,表示最少花费的代价。

输入输出样例

输入样例#1:

5 3
1 2 4
1 0 4
1 3 8
2 1 1
2 4 3
输出样例#1:

4

说明

【数据范围】

10%的数据:2≤n≤10;

100%的数据:2≤n≤100000,2≤k≤n,1≤c≤1000000。

思路:正难则反,如果正着很难想,就反过来,贪心的给所有的边从大到小去排个序,然后用并查集去维护看看两个集合能否合并,如果这两个集合中有人相互敌对就不能,反之就可以。最后的答案就是ans-维护的值。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN 100001
using namespace std;
int n,k;
long long ans;
int vis[MAXN],fa[MAXN];
struct nond{
int x,y,z;
}edge[MAXN];
int cmp(nond a,nond b){
return a.z>b.z;
}
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=k;i++){
int x;
scanf("%d",&x);
vis[x]=;
}
for(int i=;i<n;i++){
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);
ans+=edge[i].z;
}
sort(edge+,edge++n-,cmp);
for(int i=;i<=n;i++) fa[i]=i;
for(int i=;i<n;i++){
int dx=find(edge[i].x);
int dy=find(edge[i].y);
if(!(vis[dx]&&vis[dy])){
fa[dy]=dx;
vis[dx]=(vis[dx]||vis[dy]);
ans-=edge[i].z;
}
}
cout<<ans;
}

洛谷 P2700 逐个击破的更多相关文章

  1. 洛谷P2700 逐个击破

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

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

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

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

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

  4. Luogu P2700 逐个击破

    qwq 同关押罪犯 对于这种希望几个对象分开的题目,只要把并查集反过来想就可以了. 既然要求删除的边权最小,那么只要反过来求给定的点不连通时保留的边权最大即为正解. 同样的,首先将边权排序,不会使敌人 ...

  5. P2700 逐个击破

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

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

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

  7. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  8. 洛谷P3369普通平衡树(Treap)

    题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...

  9. 洛谷 USACO P2207 Photo

    P2207 Photo 题目描述 Framer Jhon 打算给他的N头奶牛照相,( 2 <= N <= 1 000 000 000) . 他们排成一条线,并且依次取1~N作为编号. 每一 ...

随机推荐

  1. 跳出$.each()循环

    return false:将停止循环 ,跳出eachreturn true:跳至下一个循环(就像在普通的循环中使用'continue').

  2. [Windows Server]新机子上装老系统·

    硬盘模式改了也得用U大师,然后再PE里装 1.U大师做启动盘 2.拷贝解压后的系统进去 3.用PE自带安装工具

  3. pthread_cond 唤醒特定线程的方法

  4. HDU 2521

    了解反素数的定义: 反素数是指[1,n]内,比n小的数的约数个数都比n的约数个数要少.注意n其实是最后一个.而在区间内,[a,b]是明显无法满足条件的. 注意了最大才5000.所以,不妨使用枚举. # ...

  5. Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

    本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函 ...

  6. 用jquery实现隐藏列表表单的显示关闭切换以及Ajax方式改动提交相应的那一行的改动内容。

    请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1 请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1 先给大家看看图片效果,大 ...

  7. tomcat为什么要禁用session?

    转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/47829755 我们先来做一个实验,用jmeter对tomcat下的一个jsp ...

  8. Python 下的 return 关键字

    def make_sum(a, b): return ('+', a, b) >> make_sum(1, 2) ('+', 1, 2) 显示地返回一个元组(tuple),当然 retur ...

  9. HTML、CSS和JS中注释类型的总结

    添加必要的注释,是一个优秀的程序员必须具备的好习惯,可以大大提高代码的可维护性.可读性. 1.HTML注释 <!--注释的内容--> 注释的地方(根据个人习惯可能有所不同): 结束标签的后 ...

  10. layui表格的新增和编辑功能前端代码

    html页面的代码(注意:引入layui相关的css): <div class="layui-form-item"> <label class="lay ...