zoukankan      html  css  js  c++  java
  • bzoj1297 / P4159 [SCOI2009]迷路

    P4159 [SCOI2009]迷路

    如果边权只有 0/1 那么不就是一个灰常简单的矩阵快速幂吗!

    然鹅边权 $<=9$

    所以我们把每个点拆成9个点!

    解决~

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #define re register
     5 using namespace std;
     6 const int mod=2009;
     7 int m,n,t;long long q;
     8 struct matrix{
     9     int a[92][92];
    10     matrix(){memset(a,0,sizeof(a));}
    11     matrix operator * (const matrix &tmp) const{
    12         matrix c;
    13         for(int i=1;i<=n;++i)
    14             for(int j=1;j<=n;++j)
    15                 for(int k=1;k<=n;++k)
    16                     c.a[i][j]=(c.a[i][j]+a[i][k]*tmp.a[k][j])%mod;
    17         return c;
    18     }
    19     matrix Pow(matrix x,int y){
    20         matrix res;
    21         for(int i=1;i<=n;++i) res.a[i][i]=1;
    22         for(;y;y>>=1,x=x*x)
    23             if(y&1) res=res*x;
    24         return res;
    25     }
    26 }st;
    27 int idx(int x,int y){return x+m*y;}//新点编号
    28 int main(){
    29     scanf("%d%d",&m,&t);n=m*9;
    30     for(int i=1;i<=m;++i){
    31         for(int j=1;j<=8;++j)
    32             st.a[idx(i,j)][idx(i,j-1)]=1;//规定idx(i,0)作为原图的点向其他点连边,其他点与该点的边权就转化为连到idx(i,dist-1)上
    33         scanf("%lld",&q);
    34         for(int j=m;j>=1;--j,q/=10)
    35             if(q%10) st.a[i][idx(j,q%10-1)]=1;
    36     }st=st.Pow(st,t);
    37     printf("%d",st.a[1][m]);
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    用户交互语句
    基础数据类型补充与总结
    Python 中表示 False 的方法
    集合
    字典
    元组
    列表
    整型数据详述和进制转换
    f-strings 详解
    字符串方法详解
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/9902354.html
Copyright © 2011-2022 走看看