SPOJ COMPANYS Two Famous Companies 最小生成树,二分,思路 难度:2
http://www.spoj.com/problems/COMPANYS/en/
题目要求恰好有k条0类边的最小生成树
每次给0类边的权值加或减某个值delta,直到最小生成树上恰好有k条边为0,此时得到最小生成树的权值-更改的值*k即为答案
但是直接这么做的话会超时,因为都是整数权值,所以只需要优先取0类边,二分整数delta即可
如果直接给所有0类边减100,让0类边优先选择,那么会导致整棵树不一定是最小的,应该优先选择的1类边没有选择
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=2e5+5;
typedef pair<int,int> P;
int first[maxn];
struct edge{
int f,t,nxt,c;
int tel;
}e[maxn],org[maxn];
int n,m,k,sum;
bool used[maxn]; void addedge(int f,int t,int c,int tel,int i){
org[i].nxt=first[f];
first[f]=i;
org[i].f=f;
org[i].t=t;
org[i].c=c;
org[i].tel=tel;
}
class Greater: public binary_function<P, P,bool>
{
public:
bool operator()(const P& a, const P& b)
{
if(a.first!=b.first)return a.first>b.first;
return e[a.second].tel<e[b.second].tel;
}
};
priority_queue <P,vector<P>,Greater> pque;
int prim(){
memset(used,false,sizeof(used));
used[0]=true;
int unum=1;
for(int p=first[0];p!=-1;p=e[p].nxt){
pque.push(P(e[p].c,p));
}
sum=0;
int ans=0;
while(unum<n&&!pque.empty()){
int p=pque.top().second;
int t=e[p].t;
int td=pque.top().first;
pque.pop();
if(used[t])continue;
if(e[p].tel)ans++;
sum+=td;
used[t]=true;
unum++; for(int p=first[t];p!=-1;p=e[p].nxt){
if(!used[e[p].t]){
pque.push(P(e[p].c,p));
}
} }
while(!pque.empty())pque.pop();
return ans;
}
int main(){
int ki=0;
while(scanf("%d%d%d",&n,&m,&k)==3&&++ki){
memset(first,-1,sizeof(first));
for(int i=0;i<m;i++){
int f,t,c,color;
scanf("%d%d%d%d",&f,&t,&c,&color);
addedge(f,t,c,1-color,2*i);
addedge(t,f,c,1-color,2*i+1);
}
int l=-110,r=110;
int ans;
while(l<=r){
int mid=(l+r)/2;
copy(org,org+2*m,e);
for(int i=0;i<2*m;i++){
if(e[i].tel){
e[i].c+=mid;
}
}
int kk=prim();
// if(kk==k){ans=sum-k*mid;break;}
if(kk<k)r=mid-1;
else {ans=sum-k*mid;l=mid+1;}
}
printf("Case %d: %d\n",ki,ans);
}
return 0;
}
SPOJ COMPANYS Two Famous Companies 最小生成树,二分,思路 难度:2的更多相关文章
- HDU 4253-Two Famous Companies(二分+最小生成树)
Description In China, there are two companies offering the Internet service for the people from all ...
- HDU 4253 Two Famous Companies
Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. O ...
- hdu4253 Two Famous Companies --- 二分+MST
给n个点.m条边的图.每条边要么属于a公司,要么属于b公司.要求一颗最小生成树,条件是当中属于a公司的边数为k. 这题做法非常巧妙. 要求最小生成树,但有一定限制,搜索.贪心显然都不正确. 要是能找到 ...
- HDOJ 4253 Two Famous Companies 二分+MST
题目意思:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值, 问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 题解:题目意思很简单就是 ...
- 洛谷 P1991 无线通讯网 Label:最小生成树 || 二分
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- hdu 4253 Two Famous Companies BZOJ 2654 tree
[题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...
- bnuoj25660 Two Famous Companies
题目链接:https://www.bnuoj.com/v3/problem_show.php?pid=25660 这个二分真的是烧脑QAQ,想了一晚上才懂了一个大概. 首先,整体思路是二分,直观上感受 ...
- LuoguP2323 [HNOI2006]公路修建问题 【最小生成树+二分】By cellur925
题目大意:给你\(n\)个点,\(m\)条边,每条边上有两个权值:一级和二级的.选\(n-1\)条边使这个图连通,并至少有\(k\)个一级边,求花费最多的一条边最小值及方案. 最大值最小,肯定会先想到 ...
- P2619 [国家集训队2]Tree I(最小生成树+二分)
P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...
随机推荐
- python装饰器的应用案例
目录 一.过程编程 二.面向装饰器和函数的编程 三.二的加强版 一.过程编程 (一)需求:打印菱形 1.空格.*号组成的菱形 2.输入菱形上半部分的行数即可打印 3.支持循环输入 (二)代码 from ...
- java-基础-【二】内部类与静态内部类
一.说明 java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top lev ...
- [py]类属性和实例属性
默认类和实例的内置属性一致 class A: """测试类""" name = "maotai" def __init_ ...
- MyEclipse优化,解决MyEclipse运行慢、卡顿问题
工具: myeclipse2015 2.0 最近想用myeclipse做一下测试,发现myeclipse运行非常卡,直接影响代码的开发,而且还出现软件卡退的情况,让我十分恼火. 一.加大JVM的非 ...
- PHP设计模式_适配器模式
将各种截然不同的函数接口封装成统一的API. PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API.类似的场景还有cache适 ...
- bzoj3751 / P2312 解方程
P2312 解方程 bzoj3751(数据加强) 暴力的一题 数据范围:$\left | a_{i} \right |<=10^{10000}$.连高精都无法解决. 然鹅面对这种题,有一种常规套 ...
- Python3.x:自动生成IP写入文本
Python3.x:自动生成IP写入文本 ''' 生成ip写入文件 ''' import time time_start = time.time() #参数:number-生成条数:start-开始i ...
- git clone,push,pull,fetch命令详解
源自 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌 ...
- windows10下如何进行源码编译安装tensorflow
1.获取python3.5.x https://www.python.org/ftp/python/3.5.4/python-3.5.4-amd64.exe 2.安装python3.5.x,默认安装即 ...
- Linux下停止没有关闭的远程登陆终端
脚本如下: #!/bin/shTTY_LOG=tty_logTTY_LOG1=tty_log1USER_NAME=`whoami`#echo ${USER_NAME}who|grep ${USER_N ...