2018.11.09 bzoj4773: 负环(倍增+floyd)
传送门
跟上一道题差不多。
考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd。
然而并没有什么单调性。
于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了。
代码:
#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 bzoj4773: 负环(倍增+floyd)的更多相关文章
- BZOJ4773: 负环(倍增Floyd)
题意 题目链接 Sol 倍增Floyd,妙妙喵 一个很显然的思路(然而我想不到是用\(f[k][i][j]\)表示从\(i\)号点出发,走\(k\)步到\(j\)的最小值 但是这样复杂度是\(O(n^ ...
- 2018.11.09 bzoj2165: 大楼(倍增+floyd)
传送门 先倍增出iii使得2i2^i2i时间时刚好有每个点能够到mmm层及以上. 然后就可以用floyd+floyd+floyd+倍增求出刚好不超过mmm层的时间,最后再补一层就行了. 代码: #pr ...
- 【BZOJ4773】负环 倍增Floyd
[BZOJ4773]负环 Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边 ...
- BZOJ4773 负环(floyd+倍增)
倍增floyd求出经过<=2k条边时两点间最短路,一个点到自身的最短路就是包含该点的最小环.然后倍增找答案即可.注意初始时到自身的最短路设为0,这样求出的最短路就是经过<=2k条边的而不是 ...
- bzoj4773 负环 倍增+矩阵
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4773 题解 最小的负环的长度,等价于最小的 \(len\) 使得存在一条从点 \(i\) 到自 ...
- BZOJ 4773: 负环 倍增Floyd
现在看来这道题就非常好理解了. 可以将问题转化为求两点间经过 $k$ 个点的路径最小值,然后枚举剩余的那一个点即可. #include <cstdio> #include <cstr ...
- 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, ...
- bzoj4773: 负环(倍增floyd)
浴谷夏令营例题...讲师讲的很清楚,没看题解代码就自己敲出来了 f[l][i][j]表示i到j走2^l条边的最短距离,显然有f[l][i][j]=min(f[l][i][j],f[l-1][i][k] ...
- bzoj 4773: 负环——倍增
Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边和自环. Input 第1 ...
随机推荐
- Codeforces Round #518 (Div. 2) [Thanks, Mail.Ru!]
Codeforces Round #518 (Div. 2) [Thanks, Mail.Ru!] https://codeforces.com/contest/1068 A #include< ...
- VM虚拟机 安装linux系统
首先需要下载VMware10 和CentOS-6.4,我这边提供了百度网盘,可供下载链接:https://pan.baidu.com/s/1vrJUK167xnB2JInLH890fw 密码:r4jj ...
- 【mysql】分区表
分区表是什么? 分区表可以按照事先创建的规则,对mysql的记录进行分组,每一个组具有一个独立的逻辑单元来存储该组的数据.典型的如:按照创建时间的年份分组,按照id的顺序分组(每1000万条数据分一个 ...
- 联机分析处理ROLAP、MOLAP和HOLAP区别(转)
OLAP(on-Line Analysis Processing)是使分析人员.管理人员或执行人员能够从多角度对信息进行快速.一致.交互地存取,从而获得对数据的更深入了解的一类软件技术.OLAP的目标 ...
- 【php 之根据函数名称动态调用该函数】
解释函数:call_user_func()以及函数call_user_func_array() 对于PHP程序员而言,函数是再熟悉不过的事物了,毕竟我们整天都在和PHP内置函数以及我们自定义的函数打交 ...
- 畅谈Redis和Memcached的区别
简述 memcached 和 redis 都很类似:都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存. 那么题主说 memc ...
- css兼容性写法大全
淘宝初始化代码 body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset ...
- 弹框alertView
// 创建一个弹框UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@“标题” message:@“显示的具体内容” delegate:s ...
- HTTP协议介绍(POST、GET、Content-Type)
什么是HTTP?超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议.HTTP/1.1 协议规定的 HTTP 请求方法 ...
- node.js中对Event Loop事件循环的理解
javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...