【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

如果点与点之间的距离都是1的话。
那么T次方之后的矩阵上a[1][n]就是所求答案了。

但是这一题的边权可能会大于1

但最多为10

很容易想到拆点。

我们把每个点又重新分为9个点。

x1,x2,x3..x9

然后对于所有的i,从xi向x[i-1]连一条单向边。

然后如果x和y有一条长度为z的边

那么从x[1]向x[z-1]连一条边。

这样从x[1]走z条边才能到y[1]

然后在这个新的图所构成的矩阵上。

把它做一下矩阵乘法。

T次方

(这种方法,类似于强行把原图拆成边权都是1的图。用旧的方法,解决新的问题。

(很巧妙的转换

然后输出对应的位置就好。

【代码】

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  4. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  5. #define all(x) x.begin(),x.end()
  6. #define pb push_back
  7. #define lson l,mid,rt<<1
  8. #define ms(x,y) memset(x,y,sizeof x)
  9. #define rson mid+1,r,rt<<1|1
  10. using namespace std;
  11. const double pi = acos(-1);
  12. const int dx[4] = {0,0,1,-1};
  13. const int dy[4] = {1,-1,0,0};
  14. const int N = 100;
  15. const int G = 100; //矩阵大小
  16. const LL MOD = 2009; //模数
  17. struct MX
  18. {
  19. int v[G+5][G+5];
  20. void O() { ms(v, 0); }
  21. void E() { ms(v, 0); for (int i = 0; i <= G; ++i)v[i][i] = 1; }
  22. void P()//输出矩阵
  23. {
  24. for (int i = 0; i <= G; ++i)
  25. {
  26. for (int j = 0; j <= G; ++j)printf("%d ", v[i][j]); puts("");
  27. }
  28. }
  29. MX operator * (const MX &b) const//矩阵乘法
  30. {
  31. MX c; c.O();
  32. for (int k = 0; k <= G; ++k)
  33. {
  34. for (int i = 0; i <= G; ++i) if (v[i][k])
  35. {
  36. for (int j = 0; j <= G; ++j)
  37. {
  38. c.v[i][j] = (c.v[i][j] + (LL)v[i][k] * b.v[k][j]) % MOD;
  39. }
  40. }
  41. }
  42. return c;
  43. }
  44. MX operator ^ (LL p) const//矩阵快速幂
  45. {
  46. MX y; y.E();
  47. MX x; memcpy(x.v, v, sizeof(v));
  48. while (p)
  49. {
  50. if (p&1) y = y*x;
  51. x = x*x;
  52. p>>=1;
  53. }
  54. return y;
  55. }
  56. }a;
  57. int n,t;
  58. char s[N+10][N+10];
  59. int main(){
  60. #ifdef LOCAL_DEFINE
  61. freopen("rush_in.txt", "r", stdin);
  62. #endif
  63. ios::sync_with_stdio(0),cin.tie(0);
  64. cin >> n >> t;
  65. for (int i = 1;i <= n;i++) cin >> (s[i]+1);
  66. for (int i = 1;i <= n;i++)
  67. for (int j = 8;j >= 1;j--)
  68. a.v[(i-1)*9+j][(i-1)*9+j-1] = 1;
  69. for (int i = 1;i <= n;i++)
  70. for (int j = 1;j <= n;j++)
  71. if (s[i][j]>'0'){
  72. int x = s[i][j]-'0';
  73. a.v[(i-1)*9][(j-1)*9+x-1] = 1;
  74. }
  75. a = a^(t);
  76. cout<<a.v[(1-1)*9][(n-1)*9]<<endl;
  77. return 0;
  78. }

【BZOJ 1297】[SCOI2009]迷路的更多相关文章

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

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

  2. [BZOJ 1297][SCOI2009]迷路

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

  3. BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]

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

  4. 1297: [SCOI2009]迷路

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

  5. 【BZOJ】1297: [SCOI2009]迷路

    [题意]给定n个点的有向带边权图,求0到n-1长度恰好为T的路径数.n<=10,T<=10^9,边权1<=wi<=9. [算法]矩阵快速幂 [题解]这道题的边权全部为1时,有简 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Android使用C代码

    Android调用C代码 1.开发工具:Android studio 2.0 2.开发前准备: 2. 3. 4.下面我们就来开发我们的程序吧, [1]创建一个java类 package com.adm ...

  2. 16 个 Linux 服务器监控命令

    如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Linux 系统管理员. 有些 Linux 发行版会提供 GUI 程序来进行系统的监控,例如 ...

  3. MySQL Query Cache 相关的问题

    最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考. 顾名思义,MySQL Query Cache 就是用来缓存和 Qu ...

  4. spring中的单例和多例

    单例 对象在整个系统中只有一份,所有的请求都用一个对象来处理,如service和dao层的对象一般是单例的. 为什么使用单例:因为没有必要每个请求都新建一个对象的时候,浪费CPU和内存. 多例 对象在 ...

  5. BA-Johnson楼控简介

  6. Mysql 下DELETE操作表别名问题

    在用DELETE删除mysql数据库数据时采取一下两种方式: 方式一:DELETE FROM B_PROSON WHERE ID = 1; 不使用别名 方式二:DELETE BP FROM B_PRO ...

  7. Qunie——自我生成程序

    Qunie是一段没有输入.但输出和它本身源代码同样的程序.本文无不论什么高深技术,纯属娱乐! 近期看到wikipedia的一个词条--Quine,简单介绍部分摘录于此,并简要翻译: A quine i ...

  8. hdu 1166 敌兵布阵——(区间和)树状数组/线段树

    pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...

  9. JAVA程序设计(11)-----面对对象0基础设计 麻将 创建麻将牌 然后洗牌 发牌~ 恩 就这样

    zzzzZZZZ 1.開始还想贴图的 实在太懒了-- 这是一张麻将 package com.lovo; import java.awt.Graphics; import java.awt.Image; ...

  10. JTCalendar

    JTCalendar是一款简易使用而且能够自己定义事件的日历.包含圈点标识的颜色等都能够自己定义.demo中还提供了转换日历模式的样例. 效果图: " style="margin: ...