码迷,mamicode.com
首页 > 其他好文 > 详细

luogu4159 迷路 (矩阵加速)

时间:2018-11-27 21:06:31      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:style   lin   namespace   sizeof   amp   efi   air   bsp   矩阵加速   

考虑如果只有距离为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\n",ans[id[1][1]][id[N][1]]);
66     return 0;
67 }

 

luogu4159 迷路 (矩阵加速)

标签:style   lin   namespace   sizeof   amp   efi   air   bsp   矩阵加速   

原文地址:https://www.cnblogs.com/Ressed/p/10028563.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!