Time Limit: 40 Sec Memory Limit: 259 MB

Submit: 957 Solved: 353

[Submit][Status][Discuss]

Description

xz是一个旅游爱好者,这次他来到了一座新的城市。城市中央有一幢高耸入云的大楼。这幢楼到底有多少层呢?据说和非负整数的个数是一样多的。xz想爬上这座大楼来观赏新城市的全景。这幢大楼的楼层从下至上用从小到大的非负整数编号。每层楼有n个房间,用1到n的正整数编号。楼层之间用电梯连接,电梯只能上行,不能下行或者同层移动。(下楼一般自行解决)电梯用(u,v,w)的形式给出,表示对于任意正整数i,有第i层的房间u到第i+w层的房间v有一部电梯。电梯只能从起点开往终点,不能中途停留。 xz想要观赏城市全景,至少需要登上第m层楼,即最终需要到达的楼层数≥m。由于乘坐电梯要缴纳高额的费用,而如果花销太大回家就没法报账了,xz希望乘坐电梯的次数最少。现在xz在第0层的1号房间,你需要求出这个最少的乘坐次数。

Input

第一行包含一个正整数T,表示数据的组数。接下来的数据分为T个部分。每个部分第一行包含两个正整数n和m,意义见题目描述。接下来n行,每行包含n个非负整数。这n行中,第i行第j个数为Wi,j,如果wi,j非零,则表示有电梯(i,j,Wi,j)。同一行各个数之间均用一个空格隔开。

Output

对于每组数据,输出一行一个正整数,最少的乘坐次数。

Sample Input

2

6 147

0 1 0 50 0 0

0 0 1 0 0 0

20 0 0 0 0 0

0 0 0 0 1 50

0 0 0 8 0 0

0 0 0 0 0 3

6 152

0 1 0 50 0 0

0 0 1 0 0 0

20 0 0 0 0 0

0 0 0 0 1 50

0 0 0 8 0 0

0 0 0 0 0 3

Sample Output

9

10

【样例说明】

第一组数据中,使用电梯的顺序为1→2→3→1→2→3→1→4→6→6;第二组数据中,使用电梯的顺序为1→2→3→1→2→3→1→4→5→4→6。第二组数据最后到达了153层,但是没有更短的路径使得恰好到达152层,因此答案为10。

HINT

有如下几类具有特点的数据: 1、有10%的数据所有的n=2; 2、有20%的数据m≤3000; 3、有20%的数据对于满足1≤i,j≤n的整数i和j,若wi,j≠0,则有wi,j≥1015; 4、有30%的数据所有的n=40。以上各类数据均不包含其他类数据。对于所有数据T=5,1≤n≤100,1≤m≤1018;对于满足1≤i,j≤n的整数i和j,有0≤wi,j≤1018。数据保证能够到达m层或更高的楼层。

解题思路

倍增floyd,设dp[i][j][t]是从第i个房间到第j个房间坐了2^t次电梯的最大上升高度,

dp[i][j][t]=max(dp[i][k][t-1],dp[k][j][t-1])

然后我们用二进制拆分确定答案。

注意赋值inf时如果要用<<,一定要用1ll!!!.

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long using namespace std;
const int MAXN = 105;
const LL inf = 1ll<<60; inline LL rd(){
LL x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
return x*f;
} int T;
int n;
LL m,ans=1,cnt; struct Mat{
LL mat[MAXN][MAXN];
Mat (){
memset(mat,0,sizeof(mat));
}
Mat operator*(const Mat &h){
Mat c;
// for(register int i=1;i<=n;i++)
// for(register int j=1;j<=n;j++)
// c.mat[i][j]=-inf;
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++){
c.mat[i][j]=-inf;
for(register int k=1;k<=n;k++)
c.mat[i][j]=max(c.mat[i][j],mat[i][k]+h.mat[k][j]);
// if(c.mat[i][j]>m) c.mat[i][j]=m;
}
return c;
}
}A,f[MAXN]; inline bool check(Mat x){
for(register int i=1;i<=n;i++)
if(x.mat[1][i]>=m) return true;
return false;
} int main(){
T=rd();
while(T--){
ans=1;
n=rd();m=rd();
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++){
LL w=rd();
if(w==0) f[1].mat[i][j]=-inf;
else f[1].mat[i][j]=w;
}
// for(register int i=1;i<=n;i++){
// for(register int j=1;j<=n;j++)
// cout<<f[1].mat[i][j]<<" ";
// cout<<endl;
// }
for(cnt=1;;cnt++){
f[cnt+1]=f[cnt]*f[cnt];
if(check(f[cnt+1])) break;
}
// cout<<cnt<<endl;
A=f[1];
for(register int i=cnt;i;i--){
Mat B=A*f[i];
if(!check(B)){
A=B;
ans+=(1ll<<i-1);
}
}
printf("%lld\n",ans+1);
}
return 0;
}

BZOJ 2165: 大楼的更多相关文章

  1. [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】

    题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...

  2. BZOJ 2165: 大楼 倍增Floyd

    卡了一上午常数,本地13s,可是bzoj 就是过不去~ #include <bits/stdc++.h> #define N 102 #define M 55 #define ll lon ...

  3. bzoj 2165: 大楼【Floyd+矩阵乘法+倍增+贪心】

    1<<i的结果需要是long long的话i是long long是没用的--要写成1ll<<i--我别是个傻子吧 虽然写的是二进制贪心,但是我觉得二分可能更好写吧(但是会慢) ...

  4. 大楼(bzoj 2165)

    Description xz是一个旅游爱好者,这次他来到了一座新的城市.城市中央有一幢高耸入云的大楼.这幢楼到底有多少层呢?据说和非负整数的个数是一样多的.xz想爬上这座大楼来观赏新城市的全景.这幢大 ...

  5. 【BZOJ】2165: 大楼

    [题意]从第0层开始有无穷层,每层有n个房间,给定矩阵A,A[i][j]表示从第x层的房间 i 可以跳到第x+A[i][j]层的房间 j (x任意),A[i][j]=0表示不能跳.初始在第0层第1个房 ...

  6. bzoj 2165 DP

    首先如果不考虑数据范围的话,因为每一层都是等效的,所以我们可以用w[i][j][k]来表示在某一层的j位置,称作i次电梯到k位置,最多上升多少层,那么我们可以比较容易的写出转移,因为m十分大,i可能与 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. BZOJ刷题指南(转)

    基础(65) 巨水无比(4):1214.3816:2B题:1000A+B:2462:输出10个1 模拟/枚举/暴力(15):4063傻子模拟:1968小学生暴力:1218前缀和暴力:3856读英文:4 ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. 欧拉定理+质因子分解+矩阵快速幂——cf1182E

    好题! /* gi=c^i * fi gi=gi-1 * gi-2 * gi-3 把g1,g2,g3质因数分解 g1=p1^e11 * p2^e12 * p3^e13 ... pk^e1k g2=p1 ...

  2. mysql的卸载重装+导入大量数据失败的解决方案+工具执行和项目执行结果不同

    1.卸载 1>快捷键win+r输入regedit进入注册表 找到3个文件夹,全部删除 . HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eve ...

  3. inspect模块的使用

    一.介绍 inspect模块主要的四种用处: 1.对是否是模块.框架.函数等进行类型检测 2.获取源码 3.获取类或函数的参数信息 4.解析堆栈 二.使用 只写了2个自己用到的方法,方法太用,http ...

  4. js 自适应容器宽高

    var echartsWarp= document.getElementById('echartsWarp'); var resizeWorldMapContainer = function () { ...

  5. [SNOI 2017] 炸弹

    题目描述: 给定炸弹和爆炸范围,求对于每个炸弹连锁爆炸的炸弹总和对\(1e9+7\)取膜 思路: 为啥都是线段树+TS+tarjan呢? 实在是搞不懂~~ 线性\(O(n)\)递推即可. #inclu ...

  6. XML、JSON、ProtocolBuffer特点比较

    XML JSON PB Lua 数据结构支持 复杂结构 简单结构 较复杂结构 复杂结构 数据保存方式 文本 文本 二进制 文本 数据保存大小 大 一般 小 一般 解析效率 慢 一般 快 稍快 语言支持 ...

  7. 杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务

    ylbtech-杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出 ...

  8. PPM 信号解析

    PWM信号 PWM信号用于控制单个电调或者单个舵机脉冲宽度调制信号. 像华科尔DEVO 10遥控接收器(RX1002)就输出10路PWM,参看下图. 舵机(电调)上用到PWM信号种类很多,我们这里对常 ...

  9. 【转载】一定要会用selenium的等待,三种等待方式必会

    转载地址:http://blog.csdn.net/huilan_same/article/details/52544521,感谢博文,学习了 原文: 发现太多人不会用等待了,博主今天实在是忍不住要给 ...

  10. shell脚本练习03--字符串

    ######################################################################### # File Name: -.sh # Author ...