BZOJ 2654 tree 二分答案+Kruskal
来源:互联网 发布:unity3d 第一人称漫游 编辑:程序博客网 时间:2024/06/15 01:06
题目大意:给定一张带权无向图,每条边有一个颜色(黑色/白色),求一棵生成树满足有
二分一个
如果
然而我并不会证明正确性。。。
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 100100using namespace std;struct edge{ int x,y,z,col; friend istream& operator >> (istream &_,edge &e) { return scanf("%d%d%d%d",&e.x,&e.y,&e.z,&e.col),++e.x,++e.y,_; }}edges[M];bool Compare1 (const edge &e1,const edge &e2)//白边优先{ if( e1.z!=e2.z ) return e1.z<e2.z; return e1.col<e2.col;}bool Compare2 (const edge &e1,const edge &e2)//黑边优先{ if( e1.z!=e2.z ) return e1.z<e2.z; return e1.col>e2.col;}int n,m,need;namespace Union_Find_Set{ int fa[M],rank[M]; void Initialize() { memset(fa,0,sizeof fa); memset(rank,0,sizeof rank); } int Find(int x) { if(!fa[x]||fa[x]==x) return fa[x]=x; return fa[x]=Find(fa[x]); } void Union(int x,int y) { x=Find(x);y=Find(y); if(x==y) return ; if(rank[x]>rank[y]) swap(x,y); if(rank[x]==rank[y]) ++rank[y]; fa[x]=y; }}bool Check(int x)//need小于最少边数返回1 大于最大反回0{ using namespace Union_Find_Set; int i,min_cnt=0,max_cnt=0,re=0; for(i=1;i<=m;i++) if(edges[i].col==0) edges[i].z+=x; Initialize(); sort(edges+1,edges+m+1,Compare1); for(i=1;i<=m;i++) { int x=Find(edges[i].x); int y=Find(edges[i].y); if(x==y) continue; Union(x,y); if(edges[i].col==0) ++max_cnt; } Initialize(); sort(edges+1,edges+m+1,Compare2); for(i=1;i<=m;i++) { int x=Find(edges[i].x); int y=Find(edges[i].y); if(x==y) continue; Union(x,y); re+=edges[i].z; if(edges[i].col==0) ++min_cnt; } for(i=1;i<=m;i++) if(edges[i].col==0) edges[i].z-=x; if(need<min_cnt) return 1; if(need>max_cnt) return 0; throw re-need*x;}void Bisection(){ int l=-101,r=101; while(r-l>1) { int mid=l+r>>1; if( Check(mid) ) l=mid; else r=mid; } Check(l); Check(r);}int main(){ int i; cin>>n>>m>>need; for(i=1;i<=m;i++) cin>>edges[i]; try { Bisection(); } catch(int ans) { cout<<ans<<endl; return 0; } printf("%d\n",1/0); return 0;}
0 0
- BZOJ 2654 tree 二分答案+Kruskal
- BZOJ 2654: tree kruskal 二分
- BZOJ[2654]Tree 二分+Kruskal
- 【BZOJ】2654 tree 二分+kruskal
- [BZOJ 2654] tree · 二分答案
- BZOJ 2654 tree 详解(最小生成树 kruskal 二分)
- BZOJ 2654 tree(二分答案+最小生成树)
- BZOJ 1196 HNOI2006 公路修建问题 二分答案+Kruskal
- BZOJ 1196 二分+Kruskal
- bzoj2654 tree(二分+kruskal)
- [Kruscal 二分] BZOJ 2654 tree
- bzoj 2016 二分答案
- BZOJ-5090 (二分答案)
- bzoj2654 tree(kruskal+二分)
- BZOJ 2654 tree 二分+最小生成树
- bzoj 2654: tree 二分+最小生成树
- BZOJ 2654: tree 最小生成树+二分
- BZOJ 3761 甄嬛 二分答案
- SysLog简介和java操作实例
- Java基础--------异常
- git简单配置
- Java并发编程:volatile关键字解析(牛人还是很多的,尤其是看了诸多文档的)
- 数据结构(Java语言)——HashTable(分离链接法)简单实现
- BZOJ 2654 tree 二分答案+Kruskal
- 浅谈微信卡券功能开发(2)
- FlashFXP 相关
- Java实体Date类型属性值无法保存到数据表对应字段的问题
- 【图文】Git学习之十步掌握通过Android Studio整合Git将本地库Push到远程库
- 剑指offer面试题27-二叉搜索树转双向链表
- ProGuard代码混淆及Spring框架时找不到利用注解获取的bean 在ant文件中加入:
- 如何在程序中调用CAFFE做图像分类
- CentOS关闭休眠和屏保模式