1482 路线统计

1482 路线统计

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石 Diamond

题解

查看运行结果

题目描述 Description

N个节点的有向图, 求从start到finish刚好经过时间time的总方案数 mod 502630.

输入描述 Input Description

第一行包含一个整数n, 所有点是从0到N-1编号.

接下来n行,每行包含n个字符. 第i行第j个字符表示i到j需要的时间. 字符只可能是’1’到’5’, 或者是’.’表示i不能到达j. 保证主对角线都是’.’.

接下来一行3个整数start, finish, time.

输出描述 Output Description

输出总方案数.

样例输入 Sample Input

3

.12

2.1

12.

0 2 5

样例输出 Sample Output

8

数据范围及提示 Data Size & Hint

对于20%的数据, 输入的字符不是’1’就是’.’;

对于100%的数据, 1 <= n <= 10; 1 <= start,finish <= n; 1 <= time <= 10^9.

分类标签 Tags 点此展开

矩阵乘法 数论

【解题报告】

第一眼,dfs,但看t的范围,显然超时。

再看,点很少(矩阵的n次幂耗时少),时间很多(走法复杂)

矩阵乘法的标志啊!!!

我们知道无边权图从s经k步到f怎么求:即01矩阵:

建立矩阵A  当且仅当存在一条边i->j ,A(i,j)=1。

令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)

类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。

同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。

但图有边权,怎么办?

两个字:拆点!

将每个点之间的关系用矩阵存储,i能1步到j标记为1,不能到标记为0,注意题中边权为1-5,则可拆点,将每个点拆成边权个点,如图:

但这样还不够,我们要建(n*n*5)^2 = 500*500的矩阵,矩阵乘法t达到500 ^ 3 这显然太多了。

于是:我们遇到一个边i,j,权为c,把它拆成i –> i+n*1 -> i+n*2 ->… -> i+n*(c-1)-> j

如图:

于是就只有(n*5)^2=50*50的矩阵了。

拆完点,矩阵就变成了01矩阵

则这个矩中的A[i][j]就保存了1步能从i到j的方案数,要求t步,则直接将矩阵自乘t次即得答案。

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=502630;
int f,t,s,n;
char c;
int ans;
int cnt;
struct node{
    int f[60][60];
}E,x;
void clean(){
    for(int i=0;i<=n;i++) E.f[i][i]=1;
}
node cheng(node a,node b){    //矩阵乘法
    node ne;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            ne.f[i][j]=0;
            for(int k=0;k<n;k++) ne.f[i][j]=(ne.f[i][j]+((long long)a.f[i][k]*b.f[k][j])%mod)%mod;
        }
    }
    return ne;
}
int answer(){
    node ne=x;
    node ass=E;
    int b=t;
    while(b){      //矩阵求幂
        if(b&1) ass=cheng(ass,ne);
        b>>=1;
        ne=cheng(ne,ne);
    }
    return ass.f[s][f];
}
int main(){
    scanf("%d\n",&n);
    cnt=n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%c",&c);
            if(c>=‘0‘&&c<=‘9‘){
                cnt=c-‘0‘;
                for(int k=1;k<cnt;k++) x.f[n*(k-1)+i][n*k+i]=1; //拆点
                x.f[n*(cnt-1)+i][j]=1;
            }
        }
        scanf("\n");
    }
    n*=5;                       //最后n要乘5
    scanf("%d%d%d",&s,&f,&t);
    clean();                    //定义单位矩阵
    printf("%d\n",answer());
    return 0;
}
时间: 2024-08-10 17:01:49

1482 路线统计的相关文章

[codevs 1482]路线统计(矩阵乘法)

题目:http://codevs.cn/problem/1482/ 分析:很像“经过K条边的最短路径条数”.但有所不同,那就是不是边数固定,而是路径总长度固定.看似不能用矩阵乘法了……但注意到每条边的长度<=5,所以可以把每个点拆成5个,每条边的边权都为1,那么路径总长度固定也就转成了边数固定.然后矩阵乘法秒之(集训队论文2008)

路线统计(codevs 1482)

题目描述 Description N个节点的有向图, 求从start到finish刚好经过时间time的总方案数 mod 502630. 输入描述 Input Description 第一行包含一个整数n, 所有点是从0到N-1编号. 接下来n行,每行包含n个字符. 第i行第j个字符表示i到j需要的时间. 字符只可能是’1’到’5’, 或者是’.’表示i不能到达j. 保证主对角线都是’.’. 接下来一行3个整数start, finish, time. 输出描述 Output Descriptio

洛谷——P1608 路径统计

P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为“1”的小镇上,而送餐的地点在标注为“N”的小镇.(有点废话)除此之外还知道这些道路都是单向的,从小镇I到J需要花费D[I,J]的时间,为了更高效快捷的将快餐送到顾客手中, 他们想走一条从小镇1到小镇N花费最少的一条路,但是他们临出发前,撞到因为在路上堵车而生气的FYY,深受启

课程路线

---恢复内容开始--- 云计算&大数据实战课程列表 first.课程说明: 本系列课程适合有一点编程基础的人员学习(比如java,python,c/c++),最好是java编程人员,特别是从事过j2ee开发的人员.学习完本套课程,可以帮助你成为大型项目架构师,特别是数据量大,并发量高的大型项目架构师,当然也能很大程度上提高你的薪资待遇. second.课程路线 third.Linux大纲 这章是基础课程,帮大家进入大数据领域打好Linux基础,以便更好地学习Hadoop,NoSQL,Oracl

FZU-2087 统计树边(最小生成树)

Problem 2087 统计树边 Accept: 223    Submit: 693Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 在图论中,树:任意两个顶点间有且只有一条路径的图. 生成树:包含了图中所有顶点的一种树. 最小生成树:对于连通的带权图(连通网)G,其生成树也是带权的.生成树T各边的权值总和称为该树的权,权最小的生成树称为G的最小生成树(Minimum Spanning Tree).最小生

php 学习路线 赵兴壮2014年4月28 日 加油

第一阶段 第一讲,WEB基础     1.1 网站基本知识: 1.2 网络协议介绍: 1.3 B/S与C/S结构的区别: 1.4 WEB编程.网站开发技术介绍.      第二讲,网页设计     2.1 Dreamweaver介绍及使用: 2.2 静态网页HTML语言: 2.3 标题与段落,换行与分割线: 2.4 表格.表单: 2.5 框架.超链接.图片.     实例:1,使用表格进行网页布局设计: 2,使用表单.表格.框架进行系统后台界面设计. 第三讲,DIV+CSS     3.1 CS

洛谷 P1608 路径统计

题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为“1”的小镇上,而送餐的地点在标注为“N”的小镇.(有点废话)除此之外还知道这些道路都是单向的,从小镇I到J需要花费D[I,J]的时间,为了更高效快捷的将快餐送到顾客手中, 他们想走一条从小镇1到小镇N花费最少的一条路,但是他们临出发前,撞到因为在路上堵车而生气的FYY,深受启发,不能仅知道一条路线

[转人工智能工程师学习路线及具备的5项基本技能

原文地址:http://blog.csdn.net/BaiHuaXiu123/article/details/52478853 摘要 学习路线 你是否对机器学习充满兴趣呢?其实到目前为止,每天有越来越多的工程师开始将好奇的目光转向机器学习领域.实际上,你会发现现在没有哪一个领域比机器学习能引起更多的曝光率和关注度.机器学习已经以一种高调姿态闯入广大民众的意识当中,无论是采用机器学习等相关技术的Google AlphaGo以5局4胜的战绩打败人类世界的围棋冠军,还是采用了机器学习技术的Twitte

Hadoop生态系统学习路线

主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等. 从2011年开始,中国进入大数据风起云涌的时代,以Hadoop为代表的家族软件,占据了大数据处理的广阔地盘.开源界及厂商,所有数据软件,无