bzoj1297 / 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 }