博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10.17_T1 平津战役
阅读量:6235 次
发布时间:2019-06-22

本文共 1174 字,大约阅读时间需要 3 分钟。

大意:

有n个点,n-1条边,破坏这条边的代价是已知的,有k个特殊的点,问使这k个点互不相连的最小代价

解题思路:

我们破坏边的最小代价就是建边使得k个点互不相连的最大代价

所以我们不用考虑删边,只考虑如何去建边
也就是说我们要搞一个生成树,用并查集+排序就OK啦~

Accepted code:

#include
#include
#include
#define N 100001using namespace std;long long ans;int n, k, a, b, f[N];bool vis[N];struct node {
int from,to,w;}e[N];inline int find(register int x) {
return x==f[x]?x:f[x]=find(f[x]); }inline bool cmp(node x,node y) {
return x.w>y.w; }inline int read(){
char c = getchar(); int d = 1, f = 0; while (!isdigit(c)) {
d = (c == '-')?(-1):(d); c = getchar();} while (isdigit(c)) f=(f<<3) + (f<<1) + c - 48, c = getchar(); return f * d;}int main(){
n=read(); k=read(); f[n]=n; for(register int i = 1; i <= k; i++) vis[read()]=1; for(register int i = 1; i < n; i++) e[i] = (node){
read(), read(), read()}, f[i]=i, ans+=e[i].w; sort(e + 1, e + n, cmp); for(register int i = 1; i < n; i++) {
a = find(e[i].from); b = find(e[i].to); if(vis[a] & vis[b]) continue; f[a] = f[b]; ans -= e[i].w; vis[a] = vis[b] = vis[a] | vis[b]; } return printf("%lld\n",ans) & 0;}

转载于:https://www.cnblogs.com/Juruo-HJQ/p/9821832.html

你可能感兴趣的文章
[译]Android view 测量布局和绘制的流程
查看>>
对一次架构设计的总结和反思
查看>>
WPF无边框捕获消息改变窗口大小
查看>>
.net Elasticsearch 学习入门笔记
查看>>
在intellij idea 中怎么不用git 解除关联
查看>>
VMware Workstation 14 Pro永久激活密钥
查看>>
事件驱动模型的简单Java实现
查看>>
QAction QActionGroup QMenu 使用方法
查看>>
SQL Server 合并复制如何把备份的发布端或订阅端BAK文件还原为数据库
查看>>
Ocelot简易教程(四)之请求聚合以及服务发现
查看>>
微信小程序使用npm安装包
查看>>
MySQL索引调优【转】
查看>>
电子书下载:Microsoft PowerPivot for Excel 2010: Give Your Data Meaning
查看>>
EXPDP/IMPDP 命令使用详解
查看>>
C# 调用 Outlook发送邮件实例
查看>>
HDU 1058 Humble Numbers
查看>>
HDU 1224 Free DIY Tour
查看>>
POJ 1975 Median Weight Bead (Floyd)
查看>>
根据用户输入的时间查询那天的数据
查看>>
协议的字段和打包解包要分离
查看>>