TopCoder SRM 642 Div.2 1000 --二分+BFS
题意: 给你一张图,N个点(0~N-1),m条边,国王要从0到N-1,国王携带一个值,当走到一条边权大于此值的边时,要么不走,要么提升该边的边权,提升k个单位花费k^2块钱,国王就带了B块钱,问能携带的最大值是多少。
解法: 二分此值,然后BFS跑遍每个点,记录到达每个点的最小花费Mincost,如果Mincost[N-1] <= B,则此值可行,往上再二分,否则往下二分。
比赛时候本来我的二分方法应该返回high的,结果返回low,怎么都过不了样例,比赛完才发现此处的问题。 真是太弱。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#define ll long long
using namespace std; struct node
{
int u;
long long cost;
}; class TallShoes
{
public:
long long mp[][],Mincost[];
int N;
bool bfs(int N,int S,int E,long long hei,long long B)
{
int i;
Mincost[] = ;
for(i=;i<N;i++)
Mincost[i] = 10000000000000000LL;
queue<node> que;
node now;
now.u = S;
now.cost = ;
que.push(now);
while(!que.empty())
{
node tmp = que.front();
que.pop();
int u = tmp.u;
long long cost = tmp.cost;
for(i=;i<N;i++)
{
if(u == i) continue;
if(mp[u][i] >= 10000000000000000LL) continue;
if(mp[u][i] >= hei)
{
if(Mincost[i] > cost)
{
Mincost[i] = cost;
now.u = i, now.cost = Mincost[i];
que.push(now);
}
}
else
{
long long dif = hei-mp[u][i];
if(Mincost[i] > cost + dif*dif)
{
Mincost[i] = cost + dif*dif;
now.u = i, now.cost = Mincost[i];
que.push(now);
}
}
}
}
if(Mincost[E] <= B) return true;
return false;
}
int maxHeight(int N, vector <int> X, vector <int> Y, vector <int> height, long long B)
{
for(int i=;i<N;i++)
{
for(int j=;j<N;j++)
mp[i][j] = 10000000000000000LL;
mp[i][i] = ;
}
for(int i=;i<X.size();i++)
mp[X[i]][Y[i]] = mp[Y[i]][X[i]] = height[i];
long long low = , high = 1000000000LL;
while(low <= high)
{
long long mid = (low+high)/2LL;
if(bfs(N,,N-,mid,B)) low = mid+;
else high = mid-;
}
return high;
}
};
TopCoder SRM 642 Div.2 1000 --二分+BFS的更多相关文章
- TopCoder SRM 560 Div 1 - Problem 1000 BoundedOptimization & Codeforces 839 E
传送门:https://284914869.github.io/AEoj/560.html 题目简述: 定义"项"为两个不同变量相乘. 求一个由多个不同"项"相 ...
- TopCoder SRM 667 Div.2题解
概览: T1 枚举 T2 状压DP T3 DP TopCoder SRM 667 Div.2 T1 解题思路 由于数据范围很小,所以直接枚举所有点,判断是否可行.时间复杂度O(δX × δY),空间复 ...
- TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame
传送门:https://284914869.github.io/AEoj/558.html 题目简述 一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子. 这个 ...
- TopCoder SRM 566 Div 1 - Problem 1000 FencingPenguins
传送门:https://284914869.github.io/AEoj/566.html 题目简述: 平面上有中心在原点,一个点在(r,0)处的正n边形的n个顶点.平面上还有m个企鹅,每个企鹅有一个 ...
- TopCoder SRM 561 Div 1 - Problem 1000 Orienteering
传送门:https://284914869.github.io/AEoj/561.html 题目简述: 题外话: 刚开始看题没看到|C|<=300.以为|C|^2能做,码了好久,但始终解决不了一 ...
- TopCoder SRM 582 Div 1 - Problem 1000 SemiPerfectPower
首先我们可以把答案差分,那么我们只需要求出\(1\)~\(x\)范围内的满足条件的数即可. 题目要求的应该是这个东西的个数: \(l \leq a*b^c \leq r(1 \le a < b) ...
- [topcoder]SRM 646 DIV 2
第一题:K等于1或者2,非常简单.略.K更多的情况,http://www.cnblogs.com/lautsie/p/4242975.html,值得思考. 第二题:http://www.cnblogs ...
- [topcoder]SRM 633 DIV 2
第一题,http://community.topcoder.com/stat?c=problem_statement&pm=13462&rd=16076 模拟就可以了. #includ ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
随机推荐
- transform:rotate在手机上显示有锯齿的解决方案大全
先来个兼容性说明,洗洗脑: div{transform:rotate(7deg);-ms-transform:rotate(7deg); /* IE 9 */-moz-transform:rotate ...
- NodeJS API简介
简单介绍下NodeJS现有API. Assert(断言):该模块用于编写程序的单元测试用例. Buffer(缓冲块) :处理二进制数据. C/C++ Addons(拓展):Addons插件就是动态连接 ...
- sharepoint2010升级到sharepoint2013的升级步骤和过程
- 用Dart写的黑白棋游戏
2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...
- 服务 {49A27252-A326-4EF1-B698-6EBC7068833C} 的计时器作业 id {573BE459-DF82-481C-84BD-CA14D287450B} 配置刷新的上一个实例仍在运行,因此将跳过当前的实例。请考虑增加作业之间的时间间隔。
在SharePoint2007的错误日志中发现大量如下错误: 07/02/2013 16:17:25.99 OWSTIMER.EXE (0x0958) 0x097C Window ...
- Android NDK环境搭建及调用JNI的简单步骤
转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3396595.html Java Native Interface (JNI)标准是java平台的一部分 ...
- CAGradientLayer的一些属性解析
CAGradientLayer的一些属性解析 iOS中Layer的坐标系统: 效果: - (void)viewDidLoad { [super viewDidLoad]; CAGradientLaye ...
- iOS中sqlite版本号
https://github.com/yapstudios/YapDatabase/wiki/SQLite-version-(bundled-with-OS) https://github.com/y ...
- gridView获得每行的值
前台代码: <asp:GridView ID="GridView1" runat="server" DataKeyNames="ID" ...
- IDA调试android so文件.init_array和JNI_OnLoad
我们知道so文件在被加载的时候会首先执行.init_array中的函数,然后再执行JNI_OnLoad()函数.JNI_Onload()函数因为有符号表所以非常容易找到,但是.init_array里的 ...