bzoj 2654 tree
来源:互联网 发布:ubuntu 16.04好用吗 编辑:程序博客网 时间:2024/06/03 22:51
bzoj 2654 tree
Description
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。
Input
第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行,每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。
Output
一行表示所求生成树的边权和。
V<=50000,E<=100000,所有数据边权为[1,100]中的正整数。
这道题怎么给人一种乱搞的感觉?但是解法十分神奇.这道题的单调性是不怎么明显的,首先它是要我们建一棵最小生成树,但我们并不会控制白边的数量.于是我们考虑到克鲁斯卡尔最小生成树算法中边权小的优先添加的特点.于是我们想到可不可以通过改变白边权值的大小来控制白边的数量.那么我们就给白边都加上一个数
代码如下
#include <cstdio>#include <algorithm>using namespace std;static const int maxm=1e6+10;struct Edge{ int x,y,v,col; bool operator < (const Edge &E) const{ return v==E.v?col<E.col:v<E.v; }}edge[maxm];int ftr[maxm],u[maxm],v[maxm],val[maxm],col[maxm];int tot,ans,k,cnt,n,m,chk;int find(int x){ return x==ftr[x]?x:ftr[x]=find(ftr[x]);}bool Kruskal(int x){ tot=0;cnt=0;chk=0; for(int i=1;i<=n;i++)ftr[i]=i; for(int i=1;i<=m;i++){ edge[i].x=u[i];edge[i].y=v[i];edge[i].v=val[i];edge[i].col=col[i]; if(!col[i])edge[i].v+=x; } sort(edge+1,edge+m+1); for(int i=1;i<=m;i++){ int dx=find(edge[i].x); int dy=find(edge[i].y); if(dx!=dy){ ftr[dx]=dy; tot+=edge[i].v; cnt++; if(!edge[i].col)chk++; } if(cnt==n-1)break; } if(chk<k)return false; return true;}int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) scanf("%d%d%d%d",&u[i],&v[i],&val[i],&col[i]), u[i]++,v[i]++; int l=-11111,r=11111; while(l<=r){ int mid=(l+r)>>1; if(Kruskal(mid))l=mid+1,ans=tot-k*mid; else r=mid-1; } printf("%d\n",ans); return 0;}
点我进入AC通道
0 0
- [bzoj 2654] tree
- BZOJ 2654 tree[Waiting]
- bzoj 2654 tree
- BZOJ 2654: tree
- bzoj 2654 tree
- BZOJ 2654 tree
- [Kruscal 二分] BZOJ 2654 tree
- BZOJ 2654: tree kruskal 二分
- BZOJ[2654]Tree 二分+Kruskal
- 【BZOJ】2654 tree 二分+kruskal
- BZOJ 2654 tree 二分+最小生成树
- [BZOJ 2654] tree · 二分答案
- BZOJ 2654 tree 二分答案+Kruskal
- bzoj 2654: tree 二分+最小生成树
- BZOJ 2654: tree (MST) 题解
- BZOJ 2654: tree 最小生成树+二分
- BZOJ 1468: Tree
- bzoj 1468: Tree
- 判断序列是否是二叉查找树的后续遍历结果
- [Cmusphinx] install problem
- Tomcat中设置数据源和连接池
- Bootstrap栅格参数
- PocketSphinx语音识别系统的编译、安装和使用
- bzoj 2654 tree
- 禁止响应布局
- LeetCode 541. Reverse String II
- 让你的win10随触摸板手势跑起来
- Android----内存溢出、内存优化、内存泄漏
- bzoj 1086 王室联邦
- Bootstrap排版前基础
- 23种设计模式14---访问者模式
- Tango 开发指南(7)— 运动追踪 API(Java 描述)