题目传送门

题目大意:给你一棵树,求把其中k个点相互隔离(不连通)所需要的边权代价。


这题我开始是想要求出把k个点联通的最小代价的,但后来发现还是实现起来比较困难,题解里貌似也没有这种做法,于是就鸽了。但是大体的思考方向还是不直接去想把k个点隔离,而是把问题转化。

花费最小代价删边->花费最大代价建边。而建边的时候如果遇到一条两边都是敌人的边,我们显然是不需要建的,所以这其实我们需要维护敌人的网络,用并查集来维护。

首先我们标记敌人点,再把边从大到小排序。枚举所有的边,如果它两端点都是敌人,那肯定不连他。如果两端点有一个是敌人,也连上,并在那个无辜的点上打一个标记,因为之后的点也不能再连他。于是我们就可以用并查集维护。最后注意我们之后调用的都是这个集合的代表元,即getf。

Code

 #include<cstdio>
#include<algorithm>
#define maxn 100090 using namespace std;
typedef long long ll; int n,k;
ll ans;
int vis[maxn],fa[maxn];
struct node{
int to,from,val;
}edge[maxn*]; bool cmp(node a,node b)
{
return a.val>b.val;
} int getf(int x)
{
if(fa[x]==x) return x;
return getf(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].from,&edge[i].to,&edge[i].val),ans+=edge[i].val;
for(int i=;i<=n;i++) fa[i]=i;
sort(edge+,edge++n-,cmp);
for(int i=;i<=n-;i++)
{
int pp=getf(edge[i].from),qq=getf(edge[i].to);
if(vis[pp]&&vis[qq]) continue;
ans-=edge[i].val;
if(qq!=pp) fa[qq]=pp;
if(vis[pp]) vis[qq]=;
else if(vis[qq]) vis[pp]=;
}
printf("%lld",ans);
return ;
}

最新文章

  1. mac系统terminal连接linux
  2. http gzip 解压缩
  3. js 日期处理,json处理
  4. Zero Requiem
  5. atitit.gui界面纵向居中总结
  6. C++类的构造、拷贝构造、析构函数等
  7. 深入设计模式(二)——单例模式(Singleton Pattern)
  8. Parser Error Message: Access is denied【转】
  9. Sed简介 (转)
  10. spring4新特性-泛型依赖注入
  11. oo第12次作业
  12. Java编程的逻辑 (79) - 方便的CompletionService
  13. python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)
  14. iOSUIWebView---快停下啦,你的愚蠢的行为
  15. iText操作PDF读取JPEG图片ArrayIndexOutOfBoundsException异常
  16. Ubuntu 14.04 下 OF-Config安装
  17. Java多线程——volatile关键字、发布和逸出
  18. ArcGIS农村土地承包经营权辅助建库软件说明书
  19. C语言获取输入,按单词输出
  20. Druid 配置_配置WebStatFilter

热门文章

  1. ubuntu如何修改root密码
  2. C#实现模拟登录百度并发送私信
  3. javascript参数arguments对象
  4. ++*p,(*p)++,*p++与*++p四者的区别
  5. Linux主要命令
  6. MongoDB安装和简单介绍
  7. WPF绑定各种数据源之object数据源
  8. 20170223 遇到自建表里面相同key值数据不唯一
  9. php网站前台utf-8格式有时会出现莫名其妙的空白行,重新保存下编码格式就可以了
  10. jconsole工具检测堆内存变化的使用