[WQS二分] BZOJ2654:tree
来源:互联网 发布:mysql官网下载 编辑:程序博客网 时间:2024/05/29 14:59
以前做这题的时候以为只是个神奇的二分,没有完全懂原理,现在发现实际上就是
考虑
#include<cstdio>#include<algorithm>using namespace std;const int maxn=100005;int n,m,K;int ans,res,cnt,mid;struct data{ int x,y,z,k;} a[maxn]; bool _cmp(const data &A,const data &B){ if(A.z+(A.k?0:mid)==B.z+(B.k?0:mid)) return A.k<B.k; return A.z+(A.k?0:mid)<B.z+(B.k?0:mid);}int fa[maxn];int getfa(int x){ return fa[x]==x?x:fa[x]=getfa(fa[x]); }bool check(){ res=0; cnt=0; for(int i=1;i<=n;i++) fa[i]=i; sort(a+1,a+1+m,_cmp); for(int i=1;i<=m;i++){ if(getfa(a[i].x)==getfa(a[i].y)) continue; fa[getfa(a[i].x)]=getfa(a[i].y); res+=a[i].z; if(!a[i].k) cnt++; } return cnt>=K;} int main(){ scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=m;i++) scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].z,&a[i].k), a[i].x++, a[i].y++; int L=-105,R=105; while(L<=R){ mid=(L+R)>>1; if(check()) L=mid+1, ans=res; else R=mid-1; } printf("%d\n",ans); return 0;}
阅读全文
0 0
- [WQS二分] BZOJ2654:tree
- bzoj2654 tree(二分+kruskal)
- bzoj2654 tree(kruskal+二分)
- 【bzoj2654】【tree】【二分+最小生成树】
- 【二分+最小生成树】bzoj2654 tree
- bzoj2654 Tree 二分答案+最小生成树
- 【BZOJ2654】tree【二分】【最小生成树】
- bzoj2654 tree 最小生成树+二分验证
- [bzoj2654]tree 二分+最小生成树
- 【bzoj2654】【二分+最小生成树】tree
- [bzoj2654]tree(二分+最小生成树)
- 【二分+最小生成树】BZOJ2654[tree]题解
- 【二分+最小生成树】BZOJ2654 tree
- [bzoj2654][最小生成树][二分]tree
- bzoj2654: tree(二分+最小生成树)
- [BZOJ2654] tree
- 【bzoj2654】 tree
- [bzoj2654] tree
- 搭建数据仓库第02篇:数据仓库技术架构解决方案
- 【Codeforces559E】Gerald and Path
- JSON对象字符串数组多字段(多列)排序
- 嵌套 Tab 时部分 Fragment 不显示及指示器 Indicator 卡顿问题
- 小结六
- [WQS二分] BZOJ2654:tree
- 【接口报错】写接口,返回json给ajax时,一直是error函数接收。
- Linux指令用之记之-tr
- word-wrap和word-break区别详解
- lambda表达式
- 关于json库的简单介绍
- 设计模式
- intellij下实现新建类和方法时的自动注释功能
- 堆区和栈区的区别