luoguP2700 逐个击破

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

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

发现自己又做了一道水题

这真的是蓝题吗?

思路和关押罪犯一样

当您A了这道题后,您可以顺利A掉luoguP1525(祝您成功

(不是很明白为什么关押罪犯就是绿题而逐个击破是蓝题

我觉得关押罪犯更难啊orz 

emmmm

正如青青姐所说,这种题要反着想

先将边从大到小排

用color数组标记一下是敌方还是己方(一开始打成了基房orz

如果是敌方就标为true

再从最大的边开始连

如果两个点都是true,显然不行,就跳过,继续下一次循环

如果只有一个点是敌方,就把两个点连到一个并查集里,以便下一次查询

计算最少花费的话,可以先把总花费加起来,每次连一条边,就减去那题条边的边权

或者每次判断不可以连的时候,在结果上加上当前边权

然后。。就没啦

上代码吧~  

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 100010
#define ll long longint fa[maxn];
bool color[maxn];
ll ans;struct EDGE{int a,b,c;
}edge[maxn];int get(int x){if(fa[x] == x)return x;return fa[x] = get(fa[x]);
}int cmp(EDGE x,EDGE y){return x.c > y.c;
}int main(){int n,k;scanf("%d%d",&n,&k);for(int i = 1;i <= k;i++){int x;scanf("%d",&x);color[x] = true;//标记敌方
  }for(int i = 1;i < n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);edge[i].a = a;edge[i].b = b;edge[i].c = c;ans += c;}for(int i = 1;i <= n;i++)fa[i] = i;sort(edge + 1,edge + n,cmp);for(int i = 1;i < n;i++){int x = get(edge[i].a);int y = get(edge[i].b);if(color[x] && color[y])//敌方不能相连continue;if(color[y])color[x] = true;if(color[x])color[y] = true;fa[x] = y;ans -= edge[i].c;}printf("%lld",ans);//一定要开long long啊!!!return 0;
}

/*

最后还有个问题

我原来开的color是int类型数组

敌方就标记为当前点编号

己方就为零

不知道为什么过不了

【哭唧唧

for(int i = 1;i <= k;i++){int x;scanf("%d",&x);color[x] = x;}
for(int i = 1;i < n;i++){int x = get(edge[i].a);int y = get(edge[i].b);if(color[x] && color[y])continue;if(color[y])color[x] = color[y];if(color[x])color[y] = color[x];fa[x] = y;ans -= edge[i].c;}

emmmm

令人头大

不知道是什么问题(不想自己de

 

*/

我们又愉快的A了一道蓝题啦~(然鹅本人还是很水,lbg不要和我抢高一最水

 

转载于:https://www.cnblogs.com/sevenyuanluo/p/10054439.html

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



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

相关文章

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

一、问题引入 一堆数据的值在不断变化,我们想要从这堆数据中获取到最大值或者最小值(比如电影排行榜中电影的排名,每部电影观看人数越多,那么该部电影的排名就越高) 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

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

C++读取txt文件中的逐个字符

为了增加读取的灵活性,所以separator和filename都设置为在主函数中获取输入或者在函数中传参的视线方法 举个例子,txt文件如下: household;2;true; 首先声明一个读取数据的文件  void read_data_file(const string& filename,char separator) seperate指的是间隔符,filename是文件名 读取

C++筛选法求素数输入m、n(m,n<100),输出[m,n]之间的素数。要求:使用筛选法求素数。求100以内素数的筛选过程:在一张纸上写上1到100全部整数,然后逐个判断它们是否是素数, 找

筛选法求素数 输入m、n(m,n<100),输出[m,n]之间的素数。要求:使用筛选法求素数。 求100以内素数的筛选过程:在一张纸上写上1到100全部整数,然后逐个判断它们是否是素数, 找出所有的非素数,把它挖掉,最后剩下的就是素数。提示:可以将1100这些数存储于数组1100下标,挖掉的数据置为0。 具体做法如下: <1> 先将1挖掉(因为1不是素数)。 <2> 找到数组中第一个非零

实现ListView的item逐个飞入效果——LayoutAnimationController

LayoutAnimationController 可以给控件设置动画效果,步骤也很简单,完全可以在Xml中实现 1.一个动画效果的xml(translate_add_button_in.xml 建在res/anim中) <?xml version="1.0" encoding="utf-8"?><translatexmlns:android="http://schemas.androi