FZYZOJ-1144 恶魔城
P1144 -- 恶魔城
时间限制:1000MS 内存限制:131072KB
状态:Accepted 标签: 图论-最短路 二分 无
Description
上帝需要创造一位战士去消灭撒旦,这位战士必须要穿过恶魔城才能与撒旦决斗。恶魔城内有M条连接N个路口(从1到N编号)的街道,每一条街道都是单向的(也就是说你不能逆着该街道指定的方向走),并且在城内无论怎么走都不可能走回原来走过的地方。开始的时候,战士的生命力(HP)为INITHP、站在1号路口,而撒旦在第N号路口等待着他。每一条街道上都有许多魔鬼,但是也有一些街道已经被上帝派去的天使占领了。当战士经过连接i号向j号路口的街道时,如果占领该街道的是恶魔,那么他的HP先加倍然后减少L[i,j],我们记为A[i,j]=-L[i,j];如果占领该街道的是天使,那么他的HP就会先加倍然后增加L[i,j],我们记为A[i,j]=+L[i,j];如果该街道不存在,那么A[i,j]=0。如果某一时刻战士的HP<=0,那么他会死亡。因为这个战士将非常无敌,当他见到撒旦的时候只要还活着,就能一口气把撒旦消灭,所以上帝不希望让他的INITHP过高。
任务:给定N,A[1..N,1..N],求最小的INITHP,使这个战士能够活着见到撒旦。
Input Format
第一行有一个正整数N(3 ≤N ≤100),下面跟着的第i行第j个数为A[i,j](绝对值不超过10000的整数)。
Output Format
输出所求最小的INITHP。
Sample Input
4
0 -4 0 -10
0 0 +3 0
0 0 0 -14
0 0 0 0
Sample Output
4
Hint
HP都为整数。
题解
因为要求HP的最小值,那么首先想到二分答案。由题目得A[i][j]的绝对值不大于10000,那么二分区间就是[1,10000]。由于最多只会有一百个点,所以可以用深搜来判定。注意由于HP不断乘二,所以到最后的数值会很大,如何解决呢?不难发现,因为A[i][j]的绝对值不大于10000,只要HP大于等于10000,那么必然可以到达终点,所以可以设10000为INF,一旦HP超过INF,就设成INF。
代码
#include <cstdio>
#include <iostream>
#define MAXN 110
#define SIZE 100000
#define INF 10005
using namespace std; char B[<<],*S=B,*T=B;char getc(){
return S==T&&(T=(S=B)+fread(B,,<<,stdin),S==T)?:*S++;
}
#define isd(c) (c>='0'&&c<='9')
int aa,bb;char ch;int Scan(){
while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=:(aa=ch-'',bb=);
while(ch=getc(),isd(ch))aa=aa*+ch-'';return bb?aa:-aa;
} struct EDGE {
int To, Next, W;
}; int N;
int A[MAXN][MAXN];
EDGE E[SIZE];
int Top, Last[MAXN]; int Min(int A, int B) {
return A < B ? A : B;
} void Add(int A, int B, int C) {
++Top;
E[Top].To = B;
E[Top].Next = Last[A];
E[Top].W = C;
Last[A] = Top;
} bool DFS(int HP, int X) {
if (X == N) return ;
for (int i = Last[X]; i; i = E[i].Next) {
if (HP * + E[i].W > ) {
if (DFS(Min(HP * + E[i].W, INF), E[i].To)) return ;
}
}
return ;
} int main() {
N = Scan();
for (int i = ; i <= N; ++i) {
for (int j = ; j <= N; ++j) {
A[i][j] = Scan();
if (A[i][j] != ) Add(i, j, A[i][j]);
}
}
int L = , R = INF;
while (L <= R) {
int Mid = (L + R) >> ;
if (DFS(Mid, )) R = Mid - ;
else L = Mid + ;
}
printf("%d\n", L);
}
FZYZOJ-1144 恶魔城的更多相关文章
- 银行爱“IOE”爱得有多深
本文由阿尔法工场欧阳长征推荐 导读:如果银行是一家海鲜酒楼,把IBM换掉相当于大搞一次装修,把Oracle换掉相当于把厨子和菜谱全部换掉,把EMC换掉相当于把放食材工具的储物间换个地方.难度在于,这海 ...
- SFC游戏列表(维基百科)
SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...
- FC红白机游戏列表(维基百科)
1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...
- [转] [腾讯游戏学院] Roguelike到底是什么?
如果你是一位资深游戏玩家,那么最近你肯定在哪里看到过 Roguelike 这个词.Roguelike 这个古老的游戏类型现在又变得很潮流,其中各种要素都在不断的被新游戏借鉴.作为一名就是比你有更多空余 ...
- POJ 1144
http://poj.org/problem?id=1144 题意:给你一些点,某些点直接有边,并且是无向边,求有多少个点是割点 割点:就是在图中,去掉一个点,无向图会构成多个子图,这就是割点 Tar ...
- ural 1144. The Emperor's Riddle
1144. The Emperor's Riddle Time limit: 1.0 secondMemory limit: 4 MB Background In the olden times th ...
- poj 1144 Network 图的割顶判断模板
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8797 Accepted: 4116 Descripti ...
- POJ 1144 Network(Tarjan求割点)
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12707 Accepted: 5835 Descript ...
- poj 1144 Network(无向图求割顶数)
题目链接:poj 1144 题意就是说有 n(标号为 1 ~ n)个网点连接成的一个网络,critical places 表示删去后使得图不连通的顶点,也就是割顶,求图中割顶的个数. 直接上大白书上的 ...
随机推荐
- Cisco AnyConnect “Failed to initialize connection subsystem”的解决方案
Per Cisco: Microsoft has released a fix-it patch providing a workaround for this issue. See KB# 3023 ...
- Java SE Java EE Java ME 的区别
Java SE(Java Platform,Standard Edition) Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程序.J ...
- [Twisted] 部署Twisted
Twisted提供了基础设施,来实现可重用.可配置的方式来部署. 1.Service Twisted使用Service来实现了许多协议,如TCP,FTP,HTTP,SSH等. 实现的IService接 ...
- GCDTimer
#import <Foundation/Foundation.h> @interface JKTimerManager : NSObject + (instancetype)sharedT ...
- GCD的一点理解
大家都知道GCD 有两种队列:一种是串行队列,一种是并发队列.什么是串行队列?串行队列就是队列中的代码块一个一个按顺序执行,每当上一个代码块执行结束后下一个代码块才会执行.打个比方,如果队列是一些首尾 ...
- WCF大文件传输服务
由于项目需要,自己写一个基于WCF的大文件传输服务雏形.觉得有一定的参考价值,因此放在网上分享. 目前版本为v1.1特点如下: 1.文件传输端口为18650 2.上传和下载文件 3.支持获取文件传输状 ...
- 【转】ASP.NET MVC教程
转自:http://www.cnblogs.com/QLeelulu/category/123326.html ASP.NET MVC的最佳实践与性能优化的文章 摘要: 就一些文章链接,就不多废话了. ...
- Qt中使用信号和槽的一点心得
信号(Signal)与槽(Slot)-Qt中的典型机制 这一篇文章中都说得很详细了,这里不再重复,只说一点在实际使用中可能会遇到的问题. 1.一个信号不要同时连接几个槽函数,不然执行的顺序是随机的,最 ...
- __init__ __new__区别
请运行代码: class A: def __init__(self): print "A.__init" def __new__(self): print "A.__ne ...
- MVVM模式应用 之介绍
M-V-VM (1)M:即Model,由现实世界抽象出来的模型: V:即View,视图,界面,该界面与用户输入设备进行交互: 但是View与Model如何进行交互呢? Binding便可以发挥作用了, ...