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 ...
随机推荐
- Sum It Up---poj1564(dfs)
题目链接:http://poj.org/problem?id=1564 给出m个数,求出和为n的组合方式:并按从大到小的顺序输出: 简单的dfs但是看了代码才会: #include <cstdi ...
- Drainage Ditches---hdu1532(最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 题意: 每次下雨的时候,农场主John的农场里就会形成一个池塘,这样就会淹没其中一小块土地,在这 ...
- arpa/inet.h所引起的Segmentation fault及网络编程常见的头文件
最近在学习Linux网络编程方面的知识,感觉还是有些困难.主要是对协议过程的理解,还有socket的API的理解不够深刻.今天复习编写了一个TCP的服务端和客户端的程序实现client.c从命令行参数 ...
- Atom预览markdown插件Markdown Preview Enhanced
atom 上目前最强的 markdown 插件Markdown Preview Enhanced 是一款为 ATOM 编辑器编写的超级强大的 Markdown 插件.这款插件意在让你拥有飘逸的 Mar ...
- sublime text2和3怎么设置修改字体
首先,请打开你的sublime text2或3,点击工具栏中的Preferences 然后打开Settings-User 打开Settings-User之后 如下图 请复制以下代码然后粘贴至花括号内 ...
- [py]类属性和实例属性
默认类和实例的内置属性一致 class A: """测试类""" name = "maotai" def __init_ ...
- Mybatis分页查询与动态SQL
一.Mybatis的分页查询 由于第一二节较为详细讲述了Mybatis的环境搭建,文件配置,SQL编写和Java代码实现,所以接下来的讲述都将只抽取关键代码和mapper文件中的关键sql,详细的流程 ...
- 模块讲解----configparser模块(my.cnf配置文件操作)
查询 1.所有节点: 2.指定节点下的所有key和values: 3.指定节点下所有的key: 4.指定节点和key下的values: # #configparser用于处理特定格式的文件,其本质上是 ...
- docker——网络配置
一.网络启动与配置参数 Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,它会在挂载其上的接口之间进行数据转发.同时,Docker随 ...
- 1 - bootstrap基本模板
bootstrap 3.x 下载地址:http://v3.bootcss.com/ 基本模板如下: <!DOCTYPE html> <html lang="zh-cn&qu ...