传送门

先倍增出iii使得2i2^i2i时间时刚好有每个点能够到mmm层及以上。

然后就可以用floyd+floyd+floyd+倍增求出刚好不超过mmm层的时间,最后再补一层就行了。

代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read(){
	ll ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int N=105;
int n;
ll m,val;
struct Matrix{
	ll a[N][N];
	inline void init(){memset(a,-1,sizeof(a));}
	friend inline Matrix operator*(const Matrix&a,const Matrix&b){
		Matrix ret;
		ret.init();
		for(register int i=1;i<=n;++i)for(register int k=1;k<=n;++k)if(~a.a[i][k])for(register int j=1;j<=n;++j)if(~b.a[k][j])ret.a[i][j]=max(ret.a[i][j],a.a[i][k]+b.a[k][j]);
		for(register int i=1;i<=n;++i)for(register int j=1;j<=n;++j)if(ret.a[i][j]>m)ret.a[i][j]=m;
		return ret;
	}
	inline bool check(){for(register int i=1;i<=n;++i)if(a[1][i]==m)return 1;return 0;}
}dis[105],mul,tmp;
int main(){
	for(register int tt=read();tt;--tt){
		n=read(),m=read();
		for(register int i=1;i<=n;++i)for(register int j=1;j<=n;++j){
			dis[0].a[i][j]=read();
			if(!dis[0].a[i][j])--dis[0].a[i][j];
		}
		int up=0;
		for(;;++up){
			dis[up+1]=dis[up]*dis[up];
			if(dis[up+1].check())break;
		}
		mul=dis[0];
		ll ans=1ll;
		for(register int i=up;~i;--i){
			tmp=mul*dis[i];
			if(!tmp.check()){
				for(register int j=1;j<=n;++j)for(register int k=1;k<=n;++k)mul.a[j][k]=tmp.a[j][k];
				ans+=1ll<<i;
			}
		}
		cout<<ans+1ll<<'\n';
	}
	return 0;
}

2018.11.09 bzoj2165: 大楼(倍增+floyd)的更多相关文章

  1. bzoj2165: 大楼(倍增floyd)

    题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ...

  2. 2018.11.09 bzoj4773: 负环(倍增+floyd)

    传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...

  3. 2018.11.09 bzoj1706: relays 奶牛接力跑(倍增+floyd)

    传送门 倍增+floyd板子题. 先列出状态fi,j,kf_{i,j,k}fi,j,k​表示经过iii条边从jjj到kkk的最短路. 然后发现可以用fi−1,j,kf_{i-1,j,k}fi−1,j, ...

  4. 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)

    传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...

  5. 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)

    传送门 先把边双连通分量用圆方树一样的方法缩点,然后把新建的树树剖维护. 注意对于边双连通分量需要维护动态最小值,可以用multisetmultisetmultiset. 代码: #include&l ...

  6. BZOJ 2165: 大楼 倍增Floyd

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

  7. 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd

    题目描述 FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100) ...

  8. Bzoj2165 大楼

    Time Limit: 40 Sec  Memory Limit: 259 MBSubmit: 779  Solved: 285[Submit][Status][Discuss] Descriptio ...

  9. OI生涯回忆录 2018.11.12~2019.4.15

    上一篇:OI生涯回忆录 2017.9.10~2018.11.11 一次逆风而行的成功,是什么都无法代替的 ………… 历经艰难 我还在走着 一 NOIP之后,全机房开始了省选知识的自学. 动态DP,LC ...

随机推荐

  1. TOJ 3151: H1N1's Problem(欧拉降幂)

    传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3151 时间限制(普通/Java): ...

  2. java序列化的认识(从多本书和多个博客中的总结)

    Serializable接口是java.io下的一个标记接口,一个类要被序列化必须实现这个接口.

  3. 微信小程序开发小技巧——单击事件传参、动态修改样式、轮播样式修改等

    一. 脚本部分: 1. 表达式无效的处理: 如果你发现自己编写的表达式无效或者数据不展示,那么请先检查你的表达式是否有添加{{}},小程序中全部都要添加的,只要是在模板中调用js中的数据 2. 获取元 ...

  4. Requested a new session but one was in progress

    作为appium初学者,估计很多人都会遇到这个错误.如何解决: 1.环境变量中去掉appium的安装路径,添加Appium\node_modules\.bin这个路径进去. 2.启动cmd 输入app ...

  5. export命令

    http://blog.csdn.net/wl_fln/article/details/7258294 http://man.linuxde.net/export export命令 功能说明:设置或显 ...

  6. Django中使用django_debug_toolbar

    一 概述 django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能. 包括查看执行的sql语句,db查询次数,request,headers,调试概览等. ...

  7. golang语言中os/user包的学习与使用

    package main; import ( "os/user" "fmt" ) func main() { //返回当前用户的结构 u, _ := user. ...

  8. 组委会正在为美团点评CodeM大赛的决赛设计新赛制

    比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛.复赛的成绩,会有不同的积分.比赛采取锦标赛赛制,分轮次进行,设某一轮有 m 个人参加,那么参赛者会被分为 m/2 组,每组恰好 ...

  9. 多线程的异常处理、线程取消、临时变量、lock

    异步多线程的异常,抓不到,因为是在子线程执行. #region 多线程的异常处理.线程取消.临时变量.lock { try { List<Task> list = new List< ...

  10. Java中重写与重载的区别

    方法重载:关键字overload,方法名和方法的返回类型都相同,方法参数个数和类型不一样方法重写:也叫方法覆盖,关键字override,相对于类继承而言,重写的方法名,返回类型,参数个数,参数类型都要 ...