luogu4159 迷路 (矩阵加速)

考虑如果只有距离为1的边,那我用在时间i到达某个点的状态数矩阵 乘上转移矩阵(就是边的邻接矩阵),就能得到i+1时间的

然后又考虑到边权只有1~9,那可以把边拆成只有距离为1的

具体做法是一个点拆成9个然后串联

 1 #include<bits/stdc++.h>
 2 #define pa pair<ll,ll>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 #define MP make_pair
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn=12,maxm=105,P=2009;
 8 
 9 inline char gc(){
10     return getchar();
11     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
13 }
14 inline ll rd(){
15     ll x=0;char c=gc();bool neg=0;
16     while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
17     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
18     return neg?(~x+1):x;
19 }
20 
21 int id[maxn][maxn],N,M,T;
22 int trans[maxm][maxm],tmp[maxm][maxm],ans[maxm][maxm];
23 
24 int main(){
25     //freopen("","r",stdin);
26     int i,j,k=0;
27     N=rd();T=rd();
28     for(i=1;i<=N;i++){
29         for(j=1;j<=9;j++){
30             id[i][j]=++M;
31             if(j!=1) trans[id[i][j]][id[i][j-1]]=1;
32         }
33     }
34     for(i=1;i<=N;i++){
35         char s[13];scanf("%s",s+1);
36         for(j=1;j<=N;j++){
37             if(s[j]!='0') trans[id[i][1]][id[j][s[j]-'0']]=1;
38         }
39     }
40     T--;
41     memcpy(ans,trans,sizeof(ans));
42     while(T){
43         if(T&1){
44             CLR(tmp,0);
45             for(i=1;i<=M;i++){
46                 for(j=1;j<=M;j++){
47                     for(k=1;k<=M;k++){
48                         tmp[i][j]=(tmp[i][j]+ans[i][k]*trans[k][j])%P;
49                     }
50                 }
51             }
52             memcpy(ans,tmp,sizeof(tmp));
53         }
54         CLR(tmp,0);
55         for(i=1;i<=M;i++){
56             for(j=1;j<=M;j++){
57                 for(k=1;k<=M;k++){
58                     tmp[i][j]=(tmp[i][j]+trans[i][k]*trans[k][j])%P;
59                 }
60             }
61         }
62         memcpy(trans,tmp,sizeof(tmp));
63         T>>=1;
64     }
65     printf("%d
",ans[id[1][1]][id[N][1]]);
66     return 0;
67 }
原文地址:https://www.cnblogs.com/Ressed/p/10028563.html