http://www.spoj.com/problems/COMPANYS/en/ 题目要求恰好有k条0类边的最小生成树 每次给0类边的权值加或减某个值delta,直到最小生成树上恰好有k条边为0,此时得到最小生成树的权值-更改的值*k即为答案 但是直接这么做的话会超时,因为都是整数权值,所以只需要优先取0类边,二分整数delta即可 如果直接给所有0类边减100,让0类边优先选择,那么会导致整棵树不一定是最小的,应该优先选择的1类边没有选择 #include <cstdio> #includ…
Description In China, there are two companies offering the Internet service for the people from all cities: China Telecom and China Unicom. They both are planning to build cables between cities. Obviously, the government wants to connect all the citi…
Two Famous Companies Time Limit: 15000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 425364-bit integer IO format: %I64d      Java class name: Main   In China, there are two companies offering the Internet service for the p…
给n个点.m条边的图.每条边要么属于a公司,要么属于b公司.要求一颗最小生成树,条件是当中属于a公司的边数为k. 这题做法非常巧妙. 要求最小生成树,但有一定限制,搜索.贪心显然都不正确. 要是能找到一种合理的控制方法,使得求MST的过程中能够控制a公司边的数量.那样问题就攻克了. 所以我们能够人为给a公司的边加上一定的权值.使得当中一些边不得不退出MST的选择范围内. 假设此时求的mst里a公司的边数>k,那么就要添加权值.边数<k时,权值为负. 所以,通过二分边权值,能够使得求得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去 逼近答案…
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都ᤕ有卫星电话)均可以通话,无论 他们相距多远.而只通过无线电收发器通话的哨所之间的距离不能超过 D,这是受收发器 的功率限制.收发器的功率越高,通话距离 D 会更远,但同时价格也会更贵. 收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器.换句话 说,每一对哨所之间的通话距离都是同一…
[题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给白边增加权值,做最小生成树,由于白边权值增大,导致不容易选白边.记f(x)为给白边增加x权值,做最小生成树后,选白边的数量,可以发现,f(x)随x增大而减小.所以可以二分x 首先,直接做MST的话白色边的数量是无法估计的.可能比要求的多,也可能更少 所以考虑怎样调整白色边的数量 通过这个思路,可以想…
题目链接:https://www.bnuoj.com/v3/problem_show.php?pid=25660 这个二分真的是烧脑QAQ,想了一晚上才懂了一个大概. 首先,整体思路是二分,直观上感受一下,就是给第0类边加一个权值,这个权值越大,会让第0类边选的个数变少:权值变小,会上第0类边的个数变多.所以二分这个权值,使得选出来的边的个数是k. 关键是怎么去做这个二分.对于一个mid(当前的权值二分点),我们去做最小生成树的时候,要给边排序,在给边排序的时候,第一关键字是边权,第二关键字是类…
题目大意:给你\(n\)个点,\(m\)条边,每条边上有两个权值:一级和二级的.选\(n-1\)条边使这个图连通,并至少有\(k\)个一级边,求花费最多的一条边最小值及方案. 最大值最小,肯定会先想到二分,如何判定?其实我们仔细读题,应该发现,他不是一个完整的最小生成树,因为没有要求边权和最小,只是需要借鉴\(Kruskal\)的建树方式,每次尽量先把一级边选出来,最后如果有点和他们不连通,那么不合法.之前说的是二分判定的过程.最后我们把方案输出即可. 注意我不知道为啥非要两种边分别存而不是存在…
P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ],ans,tt; ],b[]; inline bool cmp(edge A,edge B){return (…