【luogu2700】逐个击破

网友投稿 666 2022-08-30

【luogu2700】逐个击破

【luogu2700】逐个击破

并查集,加最小生成树技巧。循环搜索边的最大权值,如果边两边是需要隔离开的,则删除该边。 直接考虑原问题比较困难,我们可以这么想:删去的最少=留下来的最多。 那么我们考虑用类似于最小生成树的思想。在使用Kruskal算法时,并查集还要保存一个是否已经有敌人的城市。然后合并的时候必须要两个集合不是都有敌人的城市(最多只有一个集合有敌人的城市)才可以合并。

#include#define N 110000struct node1{ int x,y,z;};struct node2{ bool f;int father;};node1 data[N];node2 a[N];int aa,n,k,h[N];int gf(int x){ if (a[x].father==x) return x; a[x].father=gf(a[x].father); return (a[x].father); }void qsort(int l,int r){ int i=l,j=r,mid=(data[(l+r)/2].z); node1 t; while (i<=j){ while (data[i].z>mid)++i; while (data[j].z

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Linux下的五个查找命令,有什么区别?
下一篇:系统可用性:SRE口中的3个9,4个9...到底是个什么东西?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~