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去 逼近答案…
给n个点.m条边的图.每条边要么属于a公司,要么属于b公司.要求一颗最小生成树,条件是当中属于a公司的边数为k. 这题做法非常巧妙. 要求最小生成树,但有一定限制,搜索.贪心显然都不正确. 要是能找到一种合理的控制方法,使得求MST的过程中能够控制a公司边的数量.那样问题就攻克了. 所以我们能够人为给a公司的边加上一定的权值.使得当中一些边不得不退出MST的选择范围内. 假设此时求的mst里a公司的边数>k,那么就要添加权值.边数<k时,权值为负. 所以,通过二分边权值,能够使得求得mst里所…
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公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给白边增加权值,做最小生成树,由于白边权值增大,导致不容易选白边.记f(x)为给白边增加x权值,做最小生成树后,选白边的数量,可以发现,f(x)随x增大而减小.所以可以二分x 首先,直接做MST的话白色边的数量是无法估计的.可能比要求的多,也可能更少 所以考虑怎样调整白色边的数量 通过这个思路,可以想…
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…
题意: 给一张图,边带权且带颜色黑白,求出一棵至少包含k条白边的MST SOL: 正常人都想优先加黑边或者是白边,我也是这么想的...你看先用白边搞一棵k条边的MST...然后维护比较黑边跟白边像堆一样慢慢往里面加...不过讲课的时候跟原题有点出入...这里只有k条边好像比较难维护... 正解也非常巧妙...首先如果有一棵MST,他所含白边数量多于k,那么我们如果可以适当增加白边的边权那么我们就可以减少它的边而且达到最优....想想很有道理你让我证明那有点日了狗了... 然后我们就二分白边的增加…
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2654 分析:此题很奇葩,我们可以给所有白边加上一个权值mid,那么在求得的MST中白边的数量就会减少,而且随着Mid的增加,白边数量是不增的,所以可以二分这个mid.…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 分蛋糕的题目,有1-n大小的n个蛋糕,要求平均分成m份,不能切开蛋糕 #include<stdio.h> #include<set> using namespace std; int main(){ set<int>s; set<int>::iterator it; long long n; int m; int part1, T; int ave; in…
题意: 有N个炸弹..每个炸弹有两个位置可以选择..把炸弹放到其中一个地方去...炸弹的爆炸范围是其为圆心的圆...两个炸弹不能有攻击范围上的重合..问要满足条件..炸弹爆炸范围的半径最长能是多少... 题解: 每个炸弹看成一类..其在两个中比选一个..符合2-sat的构图条件....那么就二分枚举炸弹的爆炸范围..枚举相互是否干扰来做边构造2-sat模型...tarjan来判断是否合法.. 题目不难..但是我2B了...在初始化vector时..for (i=0;i<(n<<1);i+…