HDOJ 4253 Two Famous Companies 二分+MST
题目意思:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的。边上有权值,
问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条。题目保证有解。
题解:题目意思很简单就是求MST且A公司要有且仅有k条边在树中,刚开始做的时候用贪心的方式求
最小生成树结果WA,后来看了下别人的题解,二分出一个最大值delta使得A公司的边加上这个值后再
求MST时A公司的边有大于等于k条,然后答案就是cost of MST - k * delta。思想就是用一个delta去
逼近答案。当delta越大的时候A公司的边就越少,反之越多。所以二分delta可以找到使得A公司刚好取K条边的要求。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int u,v,cost;
bool operator < (node a)const{
return cost < a.cost;
}
}arr[2][100005];
int father[100005];
int n,m,k,num[2],mincost;
int find(int x){
if( x != father[x])
return father[x] = find(father[x]);
return father[x];
}
int union_set(int x,int y){
x = find(x);
y = find(y);
if( x != y){
father[x] = y;
return 1;
}
return 0;
}
bool check(int delta){
int tel = k,Union = n-k-1;
int nn = n,i,j;
mincost = 0;
for( i = 0; i <= n; i++)father[i] = i;
i = j = 0;
while( nn > 1 ){
if( j < num[1] && ( i >= num[0] || arr[0][i].cost + delta > arr[1][j].cost)){
if( union_set(arr[1][j].u,arr[1][j].v ) )
{
mincost += arr[1][j].cost;
nn--;
Union--;
}
j++;
}
else{
if( union_set(arr[0][i].u,arr[0][i].v ) ){
mincost += arr[0][i].cost + delta;
nn--;
tel --;
}
i++;
}
}
return tel <= 0;
}
int main(){
struct node tmp;
int cas = 1;
int u,v,cost,x;
int l,r,mid,m;
freopen("in.txt","r",stdin);
while( ~scanf("%d%d%d",&n,&m,&k)){
num[0] = num[1] = r = 0;
for(int i = 0; i < m; i++){
father[i] = i;
scanf("%d%d%d%d",&tmp.u,&tmp.v,&tmp.cost,&x);
arr[x][num[x]++] = tmp;
}
for( int i = 0; i < 2; i++)
sort(arr[i],arr[i]+num[i]);
l = -110,r = 110;
int res;
while( l <= r){
mid = (l+r)>>1;
if( check(mid) ){
res = mincost;
m = mid;
l = mid + 1;
}
else r = mid - 1;
}
printf("Case %d: %d\n",cas++,res - m*k);
}
}
HDOJ 4253 Two Famous Companies 二分+MST的更多相关文章
- hdu4253 Two Famous Companies --- 二分+MST
给n个点.m条边的图.每条边要么属于a公司,要么属于b公司.要求一颗最小生成树,条件是当中属于a公司的边数为k. 这题做法非常巧妙. 要求最小生成树,但有一定限制,搜索.贪心显然都不正确. 要是能找到 ...
- HDU 4253 Two Famous Companies
Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. O ...
- hdu 4253 Two Famous Companies BZOJ 2654 tree
[题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...
- SPOJ COMPANYS Two Famous Companies 最小生成树,二分,思路 难度:2
http://www.spoj.com/problems/COMPANYS/en/ 题目要求恰好有k条0类边的最小生成树 每次给0类边的权值加或减某个值delta,直到最小生成树上恰好有k条边为0,此 ...
- HDU 4253-Two Famous Companies(二分+最小生成树)
Description In China, there are two companies offering the Internet service for the people from all ...
- BZOJ 2654 & 玄学二分+MST
题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一 ...
- [BZOJ2654]tree(二分+MST)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边 ...
- hdoj 5355 Cake(分析+二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 分蛋糕的题目,有1-n大小的n个蛋糕,要求平均分成m份,不能切开蛋糕 #include<s ...
- HDOJ 3622 - Bomb Game 2-sat+二分....细心...
题意: 有N个炸弹..每个炸弹有两个位置可以选择..把炸弹放到其中一个地方去...炸弹的爆炸范围是其为圆心的圆...两个炸弹不能有攻击范围上的重合..问要满足条件..炸弹爆炸范围的半径最长能是多少.. ...
随机推荐
- Python3数据驱动ddt
对于同一个方法执行大量数据的程序时,我们可以采用ddt数据驱动的方式,来对数据规范化整理及输出 一.需要使用python的ddt库,ddt,data,unpack方法 1.仅使用ddt和data,代码 ...
- git远程服务器回滚
1.git log查找commit hash 2.git reset --hard hash 回滚本地git库 3.git push -f origin(git仓库的url) branch名 强制提交
- 数字麦克风PDM信号采集与STM32 I2S接口应用
数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...
- 利用ImageAI库只需几行python代码超简实现目标检测
目录 什么是目标检测 目标检测算法 Two Stages One Stage python实现 依赖 安装 使用 附录 什么是目标检测 目标检测关注图像中特定的物体目标,需要同时解决解决定位(loca ...
- Viper-Go一站式配置管理工具
什么是Viper Viper是一个方便Go语言应用程序处理配置信息的库.它可以处理多种格式的配置.它支持的特性: 设置默认值 从JSON.TOML.YAML.HCL和Java properties文件 ...
- zookeeper基本知识入门(一)
之前我们在搭建hadoop分布式环境的时候用到过Zookeeper注册hadoop服务.那么到底Zookeeper在分布式环境中发挥了什么作用呢,这次我们就来讨论这个问题. 在分布式系统中通常都会有多 ...
- vue-cli中的跨域之proxytable
为什么会有跨域? 浏览器有一个叫做同源策略的东西.同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的重要安全机制. 同源策略规定了如果两个页面的协 ...
- cs231n---生成模型
1 生成模型的定义和分类 生成模型是一种无监督学习方法.其定义是给一堆由真实分布产生的训练数据,我们的模型从中学习,然后以近似于真实的分布来产生新样本. 生成模型分为显式和隐式的生成模型: 为什么生成 ...
- 使用Graphlab参加Kaggle比赛(2017-08-20 发布于知乎)
之前用学生证在graphlab上申了一年的graphlab使用权(华盛顿大学机器学习课程需要)然后今天突然想到完全可以用这个东东来参加kaggle. 下午参考了一篇教程,把notebook上面的写好了 ...
- Django+Vue前后端分离项目的部署
部署静态文件: 静态文件有两种方式 1:通过django路由访问 2:通过nginx直接访问 方式1: 需要在根目录的URL文件中增加 url(r'^$', TemplateView.as_view( ...