【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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • KindEditor是一套很方便的html编译器插件

    KindEditor是一套很方便的html编译器插件

    2021年11月5日
    53
  • 2021版idea激活码(已测有效)

    2021版idea激活码(已测有效),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    146
  • 论坛发帖技巧_百度贴吧回复显示帖子审核中

    论坛发帖技巧_百度贴吧回复显示帖子审核中8)今天看到个帖子,想贴个回复,点个引用出来了小测验.开始的时候还没细看以为是调查,结果:cry:看表情应该知道,原来是有答案的,大部分答错,也没了逛论坛的心情.我很想知道,以最俗的免费公厕,要是说大家没用过,那我肯定不相信,一般的公厕都在入门的地方挂个牌牌,使用细则什么的,试问:有人上公厕之前认真细读过么?而…

    2022年9月25日
    0
  • leetcode-76最小覆盖子串(双指针)

    leetcode-76最小覆盖子串(双指针)原题链接给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = “ADOBECODEBANC”, t = “ABC”输出:”BANC”示例 2:输入:s = “a”, t = “a”输出:”a” 提示:1 <= s.length, t.length <= 105s 和 t 由英文字母组成进阶:

    2022年8月8日
    3
  • sigmoid函数解析式_phonetic函数

    sigmoid函数解析式_phonetic函数Sigmoid函数,即f(x)=1/(1+e-x)。是神经元的非线性作用函数。广泛应用在神经网络中。神经网络的学习是基于一组样本进行的,它包括输入和输出(这里用期望输出表示),输入和输出有多少个分量就有多少个输入和输出神经元与之对应。最初神经网络的权值(Weight)和阈值(Threshold)是任意给定的,学习就是逐渐调整权值和阈值使得网络的实际输出和期望输出一致。给定以下的总输

    2022年10月22日
    0
  • ehviewer_EhViewer(E绅士)最新版-EhViewer2021里站最新版v1.7.6-3355游戏网[通俗易懂]

    ehviewer_EhViewer(E绅士)最新版-EhViewer2021里站最新版v1.7.6-3355游戏网[通俗易懂]EhViewerapp里面有着许多的福利漫画资源哦,这里面的漫画更新的速度也是超级的快,可以让你更好的进行自己的漫画观看哦,这里面的漫画类型也是多样化的哦,每一款都是你的最爱哦,你可以在这里阅读到大量的漫画资源哦,画质也是超级的高清,这里面的漫画阅读是没有任何的广告的哦,可以让你享受到更多的漫画精彩。『EhViewer优势』1.更新速度快,每天都有新漫画资源推荐2.资源丰富,漫画类型丰富3.操作简…

    2022年7月24日
    241

发表回复

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

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