hdu4253 Two Famous Companies --- 二分+MST
给n个点。m条边的图。每条边要么属于a公司,要么属于b公司。要求一颗最小生成树,条件是当中属于a公司的边数为k。
这题做法非常巧妙。
要求最小生成树,但有一定限制,搜索、贪心显然都不正确。
要是能找到一种合理的控制方法,使得求MST的过程中能够控制a公司边的数量。那样问题就攻克了。
所以我们能够人为给a公司的边加上一定的权值。使得当中一些边不得不退出MST的选择范围内。
假设此时求的mst里a公司的边数>k,那么就要添加权值。边数<k时,权值为负。
所以,通过二分边权值,能够使得求得mst里所含a公司的边数逐渐逼近k,此时记录答案,由于一定有解,所以终于一定是所求答案。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxm=100010;
const int maxn=50010;
struct node
{
int u,v,w,ty;
}e[maxm];
int r[maxn],n,m,k,ret,telecom; bool cmpw(node a,node b)
{
if(a.w!=b.w) return a.w<b.w;
return a.ty<b.ty;
}
int root(int a)
{
if(r[a]==-1) return a;
return r[a]=root(r[a]);
}
bool kru(int x)
{
for(int i=0;i<m;i++)
if(e[i].ty==0) e[i].w+=x;
sort(e,e+m,cmpw);
memset(r,-1,sizeof r);
int edge=0;telecom=n-1;ret=0;
for(int i=0;i<m;i++)
{
int ra=root(e[i].u);
int rb=root(e[i].v);
if(ra!=rb)
{
r[ra]=rb;
ret+=e[i].w;
telecom-=e[i].ty;
if(++edge==n-1) break;
}
}
for(int i=0;i<m;i++)
if(e[i].ty==0) e[i].w-=x;
return telecom>=k;
} int main()
{
int cas=1;
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=0;i<m;i++)
scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].w,&e[i].ty);
int l=-100,r=100,mid,ans=0x3f3f3f3f;
while(l<=r)
{
mid=(l+r)/2;
if(kru(mid)) l=mid+1,ans=ret-mid*k;
else r=mid-1;
}
printf("Case %d: %d\n",cas++,ans);
}
return 0;
}
hdu4253 Two Famous Companies --- 二分+MST的更多相关文章
- HDOJ 4253 Two Famous Companies 二分+MST
题目意思:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值, 问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 题解:题目意思很简单就是 ...
- HDU 4253 Two Famous Companies
Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. O ...
- 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中白边 ...
- hdu 4253 Two Famous Companies BZOJ 2654 tree
[题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...
- BZOJ 2654: tree( 二分 + MST )
我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...
- bnuoj25660 Two Famous Companies
题目链接:https://www.bnuoj.com/v3/problem_show.php?pid=25660 这个二分真的是烧脑QAQ,想了一晚上才懂了一个大概. 首先,整体思路是二分,直观上感受 ...
随机推荐
- [NOI2013模拟] BZOJ4705 棋盘游戏 解题报告(组合计数)
莫名打不开这道题的链接,请读者自行搜索 Description 有一个N*M的棋盘,初始每个格子都是白色的.行操作是指选定某一行,将这行所有格子的颜色取反(黑白互换).列操作是指选定某一列,将这列所有 ...
- 如何设置eclipse代码自动提示功能
如何设置eclipse代码自动提示功能 我们在刚安装完使用eclipse进行开发时,会发现没有代码提示会非常的不方便,下面小编将告诉你如何进行代码自动提示的设置. 工具/原料 eclipse 电脑 ...
- PostgreSQL备份与还原
物理备份:整个数据库的数据目录及文件做备份:备份整个数据库的文件系统. 物理恢复:恢复整个数据库的文静系统. 物理备份方法: 开启归档 select pg_start_backup('backup—— ...
- Linux 设置交换分区
当需要添加swap分区时,可以使用如下方法:设置交换分区:1 以dd指令建立swapoff2 mkswap 来将swapfile 格式化为swap的档案格式.3 swapon 来启动该系统文件,使之成 ...
- linux系统下,11款常见远程桌面控制软件(转载)
远程控制能够给人们带来很多便利,本文介绍了11款常见的Linux系统下的远程桌面控制工具,总有一款能适合您. 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图 ...
- 1x1卷积核作用
1. 实现跨通道的交互和信息整合 对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量! 对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把 ...
- caffe(2) 数据层及参数
要运行caffe,需要先创建一个模型(model),如比较常用的Lenet,Alex等, 而一个模型由多个屋(layer)构成,每一屋又由许多参数组成.所有的参数都定义在caffe.proto这个文件 ...
- 洛谷P3402 【模板】可持久化并查集
一定注意每一次都要是 $root[cur]=root[cur-1]$,不然进行合并时如果 $a,b$ 在同一集合中就会使 $root[cur]=0$. Code: #include <cstdi ...
- whoami---打印当前有效的用户名称
whoami命令用于打印当前有效的用户名称,相当于执行id -un命令. 语法 whoami(选项) 选项 --help:在线帮助: --version:显示版本信息. 实例 [root@localh ...
- Laravel+vue实现history模式URL可行方案
项目:laravel + vue 实现前后端分离.vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. h ...