tyvj P3737 逐个击破

2023-10-09 14:30
文章标签 击破 tyvj 逐个 p3737

本文主要是介绍tyvj P3737 逐个击破,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://tyvj.cn/p/3737

时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

秉承伟大军事家的战略思想,作为一个有智慧的军长你,遇到了一个类似的战场局面:

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

输入格式

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

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

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

城市的编号从0开始计数。

其中:

2<=n<=100000

2<=k<=n

1<=c<=1000000

输出格式

包含一个整数,表示最少花费的代价。

测试样例1

输入

3 3

0 1 2

0 1 1

1 2 2

输出

3

测试样例2

输入

5 3

1 2 4 

1 0 4 

1 3 8 

2 1 1

2 4 3

输出

4

破坏的最少=留下的最多,

使最多一个敌军驻地包含在内一个连通子图内

做最大生成树,需要合并连个同在敌占区的组合时,这条边就是应该被破坏的。

例如:7-9不需要破坏,将9并入敌占区;

           6-7不需要破坏,将6并入敌占区;

          6,8同在敌占区, 6-8 需要破坏,这是连接7,8的最短路。

同理,将5并入敌占区

将1,2,4并入3对应的敌占区;

最后,将4-5切断。

 

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define Size 100005int n,k;
struct edge{int u,v,w;
}eg[Size];
long long ans=0;
bool tag[Size];int pa[Size];
void init(){for(int i=1;i<=n;i++)pa[i]=i;
}
int find(int x){if(pa[x]!=x)pa[x]=find(pa[x]);return pa[x];
}bool ff(edge a,edge b){return a.w>b.w;
}void kruskal(){init();sort(eg+1,eg+n,ff);for(int i=1;i<=n-1;i++){int x=find(eg[i].u);int y=find(eg[i].v);if(tag[x]&&tag[y]){ans+=eg[i].w;}else{tag[y]=tag[x]||tag[y];pa[x]=y;}}
}int main(){scanf("%d%d",&n,&k);int x;for(int i=1;i<=k;i++){scanf("%d",&x);tag[x]=true;}for(int i=1;i<=n-1;i++){scanf("%d%d%d",&eg[i].u,&eg[i].v,&eg[i].w);}kruskal();printf("%lld",ans);
}

注意一定用scanf

用cin超时。。。

 

转载于:https://www.cnblogs.com/FuTaimeng/p/5609556.html

这篇关于tyvj P3737 逐个击破的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/173492

相关文章

堆(逐个添加元素创建堆)-堆结构的创建+堆结构的实际应用

一、问题引入 一堆数据的值在不断变化,我们想要从这堆数据中获取到最大值或者最小值(比如电影排行榜中电影的排名,每部电影观看人数越多,那么该部电影的排名就越高) 1、数据结构解决的是数据的存储问题,算法解决的是存储了的数据的使用效率问题 2、数据结构里面的堆结构(heap)和Java语言中的数据堆不一样 3、数据结构里面的堆结构本质上是数组 4、数组的元素查询效率高(由于使用索引查询),时

字符串处理算法(二)逐个打印中文字符串

根据帖子: http://bbs.csdn.net/topics/390598291里的要求: C/C++ code ?

安卓Kotlin 实现动态逐行逐个添加控件

思路为在竖向LinearLayout上添加多个横向LinearLayout,从而实现动态排列。控件以按钮为例 竖向LinearLayout <ScrollViewandroid:id="@+id/s"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintBottom_toTopOf="paren

sparkJavaApi逐个详解

说明:掌握spark的一个关键,就是要深刻理解掌握RDD各个函数的使用场景,这样我们在写业务逻辑的时候就知道在什么时候用什么样的函数去实现,得心应手,本文将逐步收集整理各种函数原理及示例代码,持续更新,方便大家学习掌握。 函数列表:   1、join的使用 2、cogroup的使用 3、GroupByKey的使用 4、map的使用 5、flatmap的使用 6、mapPartitions的使

JavaFX 动态加载目录下所有WAV文件并逐个播放

在JavaFX中动态加载一个目录下的所有.wav文件并逐个播放,你可以使用java.nio.file包来遍历目录,并使用javax.sound.sampled包来播放音频文件。不过,需要注意的是,JavaFX本身并不直接支持音频播放,但你可以使用Java的标准库来播放音频,并在JavaFX应用中同步这些操作。 以下是一个简单的步骤说明和示例代码: 遍历目录并获取所有.wav文件:使用Files

BZOJ 3224 Tyvj 1728 普通平衡树(权值线段树)

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224   题目大意:您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,

Excel里,逐个打字录入信息太慢了?试试这个方法吧!

转自:https://www.pinlue.com/article/2021/06/1010/5111631711832.html

用C#逐个读取EXCEL单元格内容

用C#逐个读取EXCEL单元格内容             Microsoft.Office.Interop.Excel.Application xApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); Microsoft.Office.Interop.Excel.Workbook xBook1 = xApp.Workboo

tyvj 1305 最大子序和 (dp 单调队列)

题目限制 时间限制内存限制评测方式题目来源1000ms131072KiB标准比较器Local 题目描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6 输入格式 第一行两个数n,m 第二行有n个数,要求在n个数找到最大子序和 输出格式 一个数

tyvj P4620 一方的loli量产计画 (快速幂)

为什么我要写这道水题呢?那是因为Yi大佬也写了这题啊…… 题面 非常明显,Last Order只可能跑掉一次。 更加明显的是:如果她会跑掉,跑掉的时刻一定不超过k,因为循环节的长度不会超过k。 于是,我们直接暴力做k次,然后快速幂就可以了。 时间复杂度: O(k+logn) O(k+logn)。 虽然很想直接Link到卡拉斯科的博客,不过反正我在酒店也没事做,谁能告诉我纪中的OJ怎