题目

春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室, 但是由于时间问题, 每次只能经过k个地方, 比方说, 这次葱头决定经过\(2\)个地方, 那他可以先去问鼎广场看看喷泉, 再去教室, 也可以先到体育场跑几圈, 再到教室. 他非常想知道, 从\(A\)点恰好经过\(k\)个点到达\(B\)点的方案数, 当然这个数有可能非常大, 所以你只要输出它模上\(1000\)的余数就可以了. 你能帮帮他么?? 你可决定了葱头一天能看多少校花哦

输入格式

输入数据有多组, 每组的第一行是2个整数 \(n, m(0 < n <= 20, m <= 100)\) 表示校园内共有\(n\)个点, 为了方便起见, 点从\(0\)到\(n-1\)编号,接着有\(m\)行, 每行有两个整数 \(s, t (0<=s,t < n)\) 表示从\(s\)点能到\(t\)点, 注意图是有向的.接着的一行是两个整数\(T\),表示有\(T\)组询问\((1<=T<=100)\), 接下来的\(T\)行, 每行有三个整数 \(A, B, k\), 表示问你从\(A\)点到\(B\)点恰好经过\(k\)个点的方案数 \((k < 20)\), 可以走重复边。如果不存在这样的走法, 则输出\(0\)

当\(n\), \(m\)都为0的时候输入结束

输出格式

计算每次询问的方案数, 由于走法很多, 输出其对1000取模的结果

输入样例

4 4
0 1
0 2
1 3
2 3
2
0 3 2
0 3 3
3 6
0 1
1 0
0 2
2 0
1 2
2 1
2
1 2 1
0 1 3
0 0

输出格式

2
0
1
3

题解

建立,邻接矩阵\(Matrix\), 则\((Matrix^k)[i][j]\)的值就是从\(i\)到\(j\)经过\(k\)个点的方法数, 所以矩阵乘法+快速幂解决

代码

#include <cstdio>
#include <cstring>
using namespace std;
const int mod = 1000;
struct Matrix {
int data[22][22], row, col;
Matrix operator*(Matrix b) {
Matrix ans(row, b.col);
memset(ans.data, 0, sizeof(ans.data));
for (int i = 0; i < ans.row; i++)
for (int k = 0; k < col; k++)
if (data[i][k])
for (int j = 0; j < ans.col; j++) {
ans.data[i][j] += data[i][k] * b.data[k][j];
ans.data[i][j] %= mod;
}
return ans;
}
Matrix operator^(int k) {
Matrix ans(row, col), self = *this;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++) ans.data[i][j] = (i == j);
while (k) {
if (k & 1) ans = ans * self;
self = self * self, k >>= 1;
}
return ans;
}
Matrix(int r, int c) {
memset(data, 0, sizeof(data));
row = r, col = c;
}
};
int main() {
int n, m, T, a, b, k;
while (scanf("%d%d", &n, &m), n + m) {
Matrix A(n, n);
while (m--) {
int x, y;
scanf("%d%d", &x, &y);
A.data[x][y] = 1;
}
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &a, &b, &k);
printf("%d\n", (A ^ k).data[a][b]);
}
}
return 0;
}

HDU 2157 How many ways?? 题解的更多相关文章

  1. HDU 2157 How many ways?? 【矩阵经典8】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2157 How many ways?? Time Limit: 2000/1000 MS (Java/Ot ...

  2. HDU 2157 How many ways??(简单线性DP | | 矩阵快速幂)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2157 这道题目很多人的题解都是矩阵快速幂写的,矩阵快速幂倒是麻烦了许多了.先给DP的方法 dp[i][ ...

  3. HDU 2157 How many ways??:矩阵快速幂【i到j共经过k个节点的方法数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2157 题解: 给你一个有向图,n个节点m条边,问你从i到j共经过k个节点的方法数(不算i点). 题解: ...

  4. HDU 2157 How many ways?? 临接矩阵+快速幂

    Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...

  5. HDU 2157 How many ways?? (邻接矩阵快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=2157 题意 : 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值   从这道题 ...

  6. Hdu 2157 How many ways??(DP||矩阵乘法)

    How many ways?? Time Limit:1000 MS Memory Limit: 32768 K Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, ...

  7. hdu 2157 How many ways?? ——矩阵十题第八题

    Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...

  8. HDU 2157 How many ways?【矩阵快速幂】

    题目 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线 ...

  9. 【传递闭包】HDU 2157 How many ways??

    UPD:现在才发现本题是个传递闭包 题目内容 春天到了,HDU校园里开满了花,姹紫嫣红,非常美丽. 葱头是个爱花的人,看着校花校草竞相开放,漫步校园,心情也变得舒畅. 为了多看看这迷人的校园,葱头决定 ...

随机推荐

  1. python IDE pycharm的安装与使用

    Python开发最牛逼的IDE——pycharm (其实其它的工具,例如eclipse也可以写,只不过比较麻烦,需要安装很多的插件,所以说pycharm是最牛逼的) pycharm,下载专业版的,不要 ...

  2. Java基础?看完以后再也不惧怕面试了

    前言 这篇文章主要是Java基础部分,主要分为3个部分:Java集合.Java多线.JVM:这些东西帮助我面试成功率提升了很多.后面还有中间件Spring.Redis.RocketMQ等等吧,祝愿大家 ...

  3. Zookeeper实现服务注册/发现

    what that? Zookeeper在分布式开发中使用频繁,但许多框架都对其进行了封装,初学者可能无法较好的理解其工作原理,该文章演示了使用Zookeeper实现服务注册,服务发现的简单demo, ...

  4. 构建操作mysql的类

    <?phpclass PdoMySQL{ public static $config=array();//设置连接参数,配置信息 public static $link=null;//保存连接标 ...

  5. MySQL数据库基础知识复习

    现在是2020年寒假,这也是新年写的第一篇博客,用了十几天的时间自学了数据库基础部分,想总结一下得失同时并通过写博客来复习前面学的知识点. 个人: 1.本来是计划一周学完基础部分的178p但没能完成这 ...

  6. TensorFlow从0到1之TensorFlow多层感知机实现MINIST分类(22)

    TensorFlow 支持自动求导,可以使用 TensorFlow 优化器来计算和使用梯度.它使用梯度自动更新用变量定义的张量.本节将使用 TensorFlow 优化器来训练网络. 前面章节中,我们定 ...

  7. Python绘图之Turtle库详解(1)

    Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行 ...

  8. tp6 路由匹配参数获取问题

    tp6是一个封装度很高的框架,在大部分场景下都能做到开箱即用 本次遇到情况为,当请求消息体为索引数组时,路由参数无法正常获取 首先看正常路由匹配 路由定义 Route::post('test/:a/: ...

  9. docker 镜像删除

    (我们以删除 php-fpm 这个镜像为例子) 一.查看镜像的 ID [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED ...

  10. MyBatis入门学习-连接oracle实现CURD基本操作

    目录 前言 导入oracle库 配置 环境配置 配置引用 配置映射 查询 单条件查询 多条件查询 通过类字段传递参数 通过Map接口传参 Param注解 插入 更新 删除 字段映射 参考文献 前言 本 ...