【BZOJ】2165: 大楼

【BZOJ】2165: 大楼

【题意】从第0层开始有无穷层,每层有n个房间,给定矩阵A,A[i][j]表示从第x层的房间 i 可以跳到第x+A[i][j]层的房间 j (x任意),A[i][j]=0表示不能跳。初始在第0层第1个房间,求最少跳几次可以到达>=m层。n<=100,m<=10^18。

【算法】矩阵快速幂

【题解】我的写法好像和网上的不太一样……

设$f_n[i]$表示跳n步在房间 i 的最高层数(这里全部的n和题目的n无关),考虑递推列向量$f_n$,设转移矩阵T,满足$T_{i,j}=A_{j,i}$,那么有:

$$T \times f_n=f_{n+1}$$

初始状态f0={1,0,0…0},那么写成幂形式:

$$T^n \times f_0=f_n$$

为了方便,容易发现$T^n$的最左一列就是$f_n$。

我们要跳到$f_n$中包含>=m的数字为止,所以预处理所有$T^{2^i}$,倍增即可。

复杂度O(n^3*log m+n log m)。

【BZOJ】2165: 大楼
【BZOJ】2165: 大楼

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=101;
const ll inf=1000000000000000000;
ll m,c2[N],c[N][N],A[70][N][N],ans[N][N],ans2[N][N];
int n;
void multply(ll a[N][N],ll b[N][N],ll d[N][N]){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            c[i][j]=-inf;//
            for(int k=1;k<=n;k++){
                c[i][j]=max(c[i][j],a[i][k]+b[k][j]);
            }
        }
    }
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)d[i][j]=c[i][j];
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        scanf("%d%lld",&n,&m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%lld",&A[0][j][i]);
                if(A[0][j][i]==0)A[0][j][i]=-inf;
            }
        }
        int tot=0;
        bool ok=0;
        for(int i=1;i<=n;i++)if(A[tot][i][1]>=m){ok=1;break;}
        if(!ok){
            while(1){
                tot++;
                multply(A[tot-1],A[tot-1],A[tot]);
                bool ok=0;
                for(int i=1;i<=n;i++)if(A[tot][i][1]>=m){ok=1;break;}
                if(ok)break;
            }
        }
        c2[0]=1;
        for(int i=1;i<=tot-1;i++)c2[i]=c2[i-1]*2;
        ll ANS=c2[tot-1];
        for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans[i][j]=A[tot-1][i][j];
        for(int i=tot-2;i>=0;i--){
            multply(ans,A[i],ans2);
            bool ok=1;
            for(int j=1;j<=n;j++)if(ans2[j][1]>=m)ok=0;
            if(ok){
                ANS+=c2[i];
                for(int k=1;k<=n;k++)for(int l=1;l<=n;l++)ans[k][l]=ans2[k][l];//
            }
        }
        printf("%lld\n",ANS+1);
    }
    return 0;
}

View Code

 

注意T[i][j]=0时设为-inf,即不可达。

 

网上的角度:关键在于题意的理解……给定n个点的有向图边权矩阵,0表示无边,求最少经过几条边使得路径长度>=m。

经过指定条边后的最长路矩阵是很容易知道的,设$C^x$表示经过x条边后的最长路矩阵,$A$表示有向边权矩阵(0要设为-inf),那么:

$$C^x(i,j)=\max_k\{C^{x-1}(i,k)+A(k,j)\}$$

所以C^x=A^x。

预处理$C^{2^i}$,然后倍增到第一行出现>=m的数字为止。

复杂度O(n^3 log m+n log m)。

 

转载于:https://www.cnblogs.com/onioncyc/p/8780568.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101723.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ConnectionString 属性尚未初始化「建议收藏」

    ConnectionString 属性尚未初始化「建议收藏」关于“ConnectionString属性尚未初始化”的问题(如下图),我在下面一段代码中发现了问题所在:publicboolReturnFlag(stringstrSQL){Chec

    2022年7月1日
    27
  • 黑马ssm项目_黑马程序员社区

    黑马ssm项目_黑马程序员社区上传到https://github.com/ahn6666/ssm2021.6.13

    2025年6月18日
    2
  • django笔记_django 异步

    django笔记_django 异步前言Django是一个开放源代码的Web应用框架,由Python写成,最初用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站,即CMS(内容管理系统)软件,于2005年7月在BSD许可证下发布,这

    2022年7月29日
    6
  • 秒懂百科视频下载(秒懂百科全集)

    秒懂百科视频下载相信很多小伙伴都有想要下载秒懂百科的视频,可是bd就是不让下载,怎么办呢,这里有一个小方法提供给大家。。。。1.首先,要下载M3U8_Downloader下载器,地址:https://pan.baidu.com/s/1kVK8FQ32.在百度百科里输入你要下载视频的词条,如图所示:请点击输入图片描述3.按键盘上的f12,打开网页的源码界面,选择network选项后,点击f5刷新后再点击你需要播放的视频,在源码界面找到.m3u8为后缀的文件,如图所示:请点击输入图片描述4.

    2022年4月17日
    197
  • 电脑磁盘未知没有初始化_win7怎么进去计算机管理

    电脑磁盘未知没有初始化_win7怎么进去计算机管理win7系统想必大家都非常熟悉吧,然而有时候可能会碰到win7系统电脑新增的硬盘没有初始化的情况,想必大家都遇到过win7系统电脑新增的硬盘没有初始化的情况吧,那么应该怎么处理win7系统电脑新增的硬盘没有初始化呢?我们依照  1、当正常增加新硬盘后,登录系统,打开磁盘管理,系统会自动打开【磁盘初始化和转换向导】,单击“下一步”; 2、正确选择要初始化的磁盘,单击“下一步”;这样的步骤就行了;下…

    2022年9月21日
    3
  • 集群机器搭建多节点MPI运行环境「建议收藏」

    集群机器搭建多节点MPI运行环境「建议收藏」1、各个节点安装MPI:https://blog.csdn.net/liu_feng_zi_/article/details/942864382、软硬件环境:1、节点:3个节点:node1,node2,node32、系统操作系统:Centos73、多节点配置1、host配置:通过下面命令打开host文件vim/etc/hosts在每个节点的host文件内添加ip地址和主机名,例如:10.10.1.12node110.10.1.56node210.

    2022年10月8日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号