1297: [SCOI2009]迷路

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1418  Solved: 1017
[Submit][Status][Discuss]

Description

windy在有向图中迷路了。 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1。 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。

Input

第一行包含两个整数,N T。 接下来有 N 行,每行一个长度为 N 的字符串。 第i行第j列为'0'表示从节点i到节点j没有边。 为'1'到'9'表示从节点i到节点j需要耗费的时间。

Output

包含一个整数,可能的路径数,这个数可能很大,只需输出这个数除以2009的余数。

Sample Input

【输入样例一】
2 2
11
00

【输入样例二】
5 30
12045
07105
47805
12024
12345

Sample Output

【输出样例一】
1

【样例解释一】
0->0->1

【输出样例二】
852

HINT

30%的数据,满足 2 <= N <= 5 ; 1 <= T <= 30 。 100%的数据,满足 2 <= N <= 10 ; 1 <= T <= 1000000000 。

一周之前做的了...想了想还是写写题解吧...

题解

首先我们都知道的一个结论是对于一个简单图 $G$ 的邻接矩阵 $M$ , $M^k_{i,j}$ 就是从点 $i$ 走 $k$ 条边到点 $j$ 的方案数.

然而这个结论只适用于两点间的边数, 而我们注意到本题中两点间的边是带权的, 我们就不能直接使用这个结论了

接着我们可以想到的其中一个解法是把一条边权为 $k$ 的边通过在其中插入虚拟结点的方式拆成 $k$ 条边, 但是极端情况下可能有 $100$ 条带权边要拆, 每条带权边可能会拆成 $10$ 条无权边, 其中会产生大量虚拟结点, 极端情况下总结点数会大于 $1000$ , 矩阵相应的也会变成这个数量级, 然后一次 $O(n^3)$ 的矩阵乘法都跑不完...╮(╯﹏╰)╭

继续思考优化方式, 现在的瓶颈在于虚拟结点过多, 我们可以思考如何缩减虚拟结点的数量. 我们可以尝试事先将一些虚拟结点和原结点连成链, 然后对于带权边都指向这条链上的对应位置, 将带权边前方的链合并起来(一股Trie的味道?)来最小化结点数量, 这样就可以把结点数量控制在 $100$ 的量级

然后就很棒棒了, 构造完矩阵无脑跑快速幂就好了(o゚▽゚)o

反正别像我一样打出了正解输出的时候把倍增矩阵当成答案矩阵输出就行了( ̄. ̄)

参考代码

GitHub

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=;
const int MOD=; int n,t;
char buf[MAXN];
int m[MAXN][MAXN];
int x[MAXN][MAXN];
int mt[MAXN][MAXN]; int Encode(int);
void Initialize();
int Encode(int,int); int main(){
Initialize();
// t--;
while(t>){
if((t&)!=){
memset(mt,,sizeof(mt));
for(int i=;i<n*;i++)
for(int j=;j<n*;j++)
for(int k=;k<n*;k++)
(mt[i][j]+=x[i][k]*m[k][j])%=MOD;
memcpy(x,mt,sizeof(mt));
}
memset(mt,,sizeof(mt));
for(int i=;i<n*;i++)
for(int j=;j<n*;j++)
for(int k=;k<n*;k++)
(mt[i][j]+=m[i][k]*m[k][j])%=MOD;
memcpy(m,mt,sizeof(mt));
t>>=;
}
printf("%d\n",x[][Encode(n-)]);
return ;
} void Initialize(){
scanf("%d%d",&n,&t);
for(int i=;i<n;i++){
for(int j=;j<=;j++){
m[Encode(i,j)][Encode(i,j-)]=;
}
}
for(int i=;i<n;i++){
scanf("%s",buf);
for(int j=;j<n;j++){
if(buf[j]!=''){
m[Encode(i)][Encode(j,buf[j]-'')]=;
}
}
}
for(int i=;i<n*;i++)
x[i][i]=;
} inline int Encode(int k,int len){
return k*+len-;
} inline int Encode(int k){
return k*;
}

Backup

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

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

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

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

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

  3. 1297: [SCOI2009]迷路

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. sqlserver 以年月日为条件查询记录

    今天做一个东西的时候,要查某年,某月的记录,从网上找到了sqlserver中的datepart函数,该函数是用来提取年份,月份,日期的一个函数,带两个参数,第一个为(yy,mm,dd)其中一个,表示年 ...

  2. SpringMVC拦截器(包括自定以拦截器--实现HandlerInterceptorAdapter)(资源和权限管理)

    一,springmvc的配置 <!-- 访问拦截 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping ...

  3. tomcat原理(一)server.xml中的host虚拟主机的理解

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  4. 利用shell脚本实现对mysql数据库的备份

    #!/bin/bash #保存备份个数 number=3 #备份保存路径 backup_dir=/root/mysqlbackup #日期 dd=`date +%Y%m%d` #备份工具 tool=m ...

  5. Latex基础__如何用latex编写矩阵、矩阵等式、方程组、等式左对齐

    数学矩阵和方程组是数学工作者经常遇到的,那么如何用latex书写处漂亮的方程组.矩阵.多个等式呢,下面将对这个问题一一做介绍.1. 写矩阵. 代码: \begin{equation} \left[ \ ...

  6. 【转载】 Spark性能优化:资源调优篇

    在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...

  7. RobotFramework下的http接口自动化Set Request Header 关键字的使用

    Set Request Header 关键字用来设置http请求时的请求头部信息. 该关键字接收两个参数,[ header_name | header_value ] 示例1:设置http请求时的Re ...

  8. Css多列语法笔记

    columns多列属性定义: column-width:规定列的宽度(此宽度是缩放scale以后的最小宽度): column-count:规定元素被分隔的列数: column-rule设置所有colu ...

  9. 洛谷P2387 [NOI2014]魔法森林(LCT,Splay)

    在XZY&XZZ巨佬的引领下,一枚蒟蒻终于啃动了这道题...... 这次还是第一次写LCT维护边权,还要化边为点,思路乱七八糟的,写起来也不顺手,还好调了许久终于AC啦. 贪心排序按一个关键字 ...

  10. 【BZOJ3262】陌上花开(CDQ分治)

    [BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...