题目类型:拆点, 矩阵快速幂

转化为矩阵快速幂,好题!

传送门:>Here<

题意:给出邻接矩阵,求\(1\)到\(N\)恰好长度为\(T\)的路径方案数

解题思路

如果题目给出的是一个\(01\)矩阵,那么直接矩阵快速幂解决。详见How many ways??

然而带权了怎么办?

转化为01矩阵!容易发现题目给出的矩阵权值小于10,因此每个点拆成10个点,顺次连接权值为1的边。然后若\((u,v)\)之间距离为\(d\),那么将\(u\)的第\(d-1\)个点连一条1的边到\(v\)的第一个点。

然后矩阵快速幂解决!

反思

看到这种相似的问题,很有可能用一种巧妙的方法将其转化为已知的经典问题。用矩阵快速幂求解路径方案数实在是经典到不能再经典了,再加上题目输入矩阵的特殊性,拆点就非常自然了。

Code

新的一种矩阵快速幂的写法,用的是一个结构体,让矩阵乘法变为一个函数。这样貌似在做快速幂的时候思路更清晰一些。然而码量增多了……

/*By DennyQi 2018*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 10010;
const int MAXM = 20010;
const int MOD = 2009;
const int INF = 1061109567;
inline int Max(const int a, const int b){ return (a > b) ? a : b; }
inline int Min(const int a, const int b){ return (a < b) ? a : b; }
inline int read(){
int x = 0; int w = 1; register char c = getchar();
for(; c ^ '-' && (c < '0' || c > '9'); c = getchar());
if(c == '-') w = -1, c = getchar();
for(; c >= '0' && c <= '9'; c = getchar()) x = (x<<3) + (x<<1) + c - '0'; return x * w;
}
struct Matrix{
int a[110][110];
inline void clear(){
memset(a, 0, sizeof a);
}
};
int N,T,dis;
Matrix g,ans;
char s[20];
inline Matrix mul(Matrix a, Matrix b){
Matrix res,tmp;
res.clear();
tmp.clear();
for(int i = 1; i <= N*10; ++i){
for(int j = 1; j <= N*10; ++j){
tmp.a[i][j] = 0;
for(int k = 1; k <= N*10; ++k){
tmp.a[i][j] = (tmp.a[i][j] + a.a[i][k] * b.a[k][j]) % MOD;
}
}
}
for(int i = 1; i <= N*10; ++i){
for(int j = 1; j <= N*10; ++j){
res.a[i][j] = tmp.a[i][j];
}
}
return res;
}
inline void quick_power(int y){
while(y > 0){
if(y & 1){
ans = mul(ans, g);
}
y /= 2;
g = mul(g, g);
}
}
int main(){
scanf("%d%d", &N, &T);
for(int i = 1; i <= N; ++i){
for(int j = 1; j < 10; ++j){
g.a[(i-1)*10+j][(i-1)*10+j+1] = 1;
}
}
for(int i = 1; i <= N; ++i){
scanf("%s", s);
for(int j = 0; j < N; ++j){
dis = s[j]-'0';
if(dis > 0){
g.a[(i-1)*10+dis][(j)*10+1] = 1;
}
}
}
for(int i = 1; i <= N*10; ++i) ans.a[i][i] = 1;
quick_power(T);
printf("%d", ans.a[1][(N-1)*10+1] % MOD);
return 0;
}

[SCOI2009] 迷路的更多相关文章

  1. BZOJ 1297: [SCOI2009]迷路( dp + 矩阵快速幂 )

    递推式很明显...但是要做矩阵乘法就得拆点..我一开始很脑残地对于每一条权值v>1的边都新建v-1个节点去转移...然后就TLE了...把每个点拆成9个就可以了...时间复杂度O((9N)^3* ...

  2. 1297: [SCOI2009]迷路

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 652  Solved: 442[Submit][Status] ...

  3. 【矩阵快速幂】bzoj1297 [SCOI2009]迷路

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1407  Solved: 1007[Submit][Status ...

  4. [BZOJ 1297][SCOI2009]迷路

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1418  Solved: 1017[Submit][Status ...

  5. B20J_1297_[SCOI2009]迷路_矩阵乘法

    B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ...

  6. 【BZOJ1297】[SCOI2009]迷路(矩阵快速幂)

    [BZOJ1297][SCOI2009]迷路(矩阵快速幂) 题面 BZOJ 洛谷 题解 因为边权最大为\(9\),所以记录往前记录\(9\)个单位时间前的.到达每个点的方案数就好了,那么矩阵大小就是\ ...

  7. bzoj1297 / P4159 [SCOI2009]迷路

    P4159 [SCOI2009]迷路 如果边权只有 0/1 那么不就是一个灰常简单的矩阵快速幂吗! 然鹅边权 $<=9$ 所以我们把每个点拆成9个点! 解决~ #include<iostr ...

  8. [Bzoj1297][Scoi2009 ]迷路 (矩阵乘法 + 拆点)

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1385  Solved: 993[Submit][Status] ...

  9. BZOJ1297: [SCOI2009]迷路 矩阵快速幂

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

  10. 1297. [SCOI2009]迷路【矩阵乘法】

    Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ...

随机推荐

  1. Redis环境搭建和代码测试及与GIS结合的GEO数据类型预研

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 1.1传统MySQL+ Memcached架构遇到的问题 My ...

  2. Android 简单登陆 涉及 Button CheckBox TextView EditText简单应用

    GitHub地址:https://github.com/1165863642/LoginDemo 直接贴代码<?xml version="1.0" encoding=&quo ...

  3. SQL Server非域(跨域)环境下镜像(Mirror)的搭建步骤及注意事项

    在实际的生产环境下,我们经常需要跨域进行数据备份,而创建Mirror是其中一个方案.但跨域创建Mirror要相对复杂的多,需要借助证书进行搭建. 下面我们将具体的步骤总结如下: 第一部分 创建证书 S ...

  4. MVC文件的上传、删除

    public ActionResult FileUpload()        {            Users users = new Users();            users = ( ...

  5. 【Python 15】分形树绘制3.0(递归函数)

    1.案例描述 将递归函数与循环函数结合绘制2.0的图形 2.案例分析 3.上机实验 """ 作者:梁斌 功能:五角星的绘制 版本:3.0 日期:03/08/2017 新增 ...

  6. vue 首页问题

    (现在其实处于不知道自己不知道状态,前端其实很多东东,不信弄个微博试试,还有那些概念的to thi tha) 1.压缩 一般 vue-cli已经压缩了 比如js 的,一般4M多压缩到 1M,还有css ...

  7. MYSQL primary key use btree 是什么含义了解一下

    CREATE TABLE `sth_definition` ( `id` int(11) NOT NULL AUTO_INCREMENT, `analyseId` bigint(20) DEFAULT ...

  8. 好程序员分享居中一个float元素

    好程序员分享居中一个float元素,我们布局的时候,用margin来设置float元素的外边距来达到效果.对于,在文档流中的元素,我们很容易让它水平居中,只要给元素设置一个固定的宽度,用margin: ...

  9. DeconvNet 论文阅读理解

    学习语义分割反卷积网络DeconvNet 一点想法:反卷积网络就是基于FCN改进了上采样层,用到了反池化和反卷积操作,参数量2亿多,非常大,segnet把两个全连接层去掉,效果也能很好,显著减少了参数 ...

  10. 洛谷 AT667 【天下一人力比較】

    题目链接 https://www.luogu.org/problemnew/show/AT667 题目描述啥的,都看不懂 就一句翻译: 读入若干个字符串,找到字典序第7的字符串并输出. 感谢@da32 ...