HDU 2157 How many ways?? 题解
题目
春天到了, 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?? 题解的更多相关文章
- 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 ...
 - HDU 2157 How many ways??(简单线性DP | | 矩阵快速幂)
		
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2157 这道题目很多人的题解都是矩阵快速幂写的,矩阵快速幂倒是麻烦了许多了.先给DP的方法 dp[i][ ...
 - HDU 2157 How many ways??:矩阵快速幂【i到j共经过k个节点的方法数】
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2157 题解: 给你一个有向图,n个节点m条边,问你从i到j共经过k个节点的方法数(不算i点). 题解: ...
 - HDU 2157 How many ways?? 临接矩阵+快速幂
		
Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...
 - HDU 2157 How many ways?? (邻接矩阵快速幂)
		
http://acm.hdu.edu.cn/showproblem.php?pid=2157 题意 : 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 从这道题 ...
 - Hdu 2157 How many ways??(DP||矩阵乘法)
		
How many ways?? Time Limit:1000 MS Memory Limit: 32768 K Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, ...
 - hdu 2157 How many ways?? ——矩阵十题第八题
		
Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...
 - HDU 2157 How many ways?【矩阵快速幂】
		
题目 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线 ...
 - 【传递闭包】HDU 2157 How many ways??
		
UPD:现在才发现本题是个传递闭包 题目内容 春天到了,HDU校园里开满了花,姹紫嫣红,非常美丽. 葱头是个爱花的人,看着校花校草竞相开放,漫步校园,心情也变得舒畅. 为了多看看这迷人的校园,葱头决定 ...
 
随机推荐
- java实现第六届蓝桥杯灾后重建
			
灾后重建 题目描述 Pear市一共有N(<=50000)个居民点,居民点之间有M(<=200000)条双向道路相连.这些居民点两两之间都可以通过双向道路到达.这种情况一直持续到最近,一次严 ...
 - 第二个hibernate  Annotation版本的helloworld
			
经过第一次的 hibernate 我发现每一个数据库表都对应了一个类,并且每一个类都要新建一个文件进行配置 很麻烦! 于是便出现了Annotation版本的hibernate. 具体如下: 1.同 ...
 - 创建使用mysql表
			
1.展示所有数据库 show databases;2.选中数据库 use database_name(;)3.创建数据库 create database database_name;4.使用2选中数据 ...
 - 数据源管理 | Kafka集群环境搭建,消息存储机制详解
			
本文源码:GitHub·点这里 || GitEE·点这里 一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部 ...
 - Edge浏览器现已支持Tampermonkey(油猴)
			
Tampermonkey,Greasemonkey,这种扩展可以让我们的浏览器自动运行我们自己定义的脚本,然后就出现了相关网站(比如https://greasyfork.org/zh-CN)让大家在上 ...
 - Beta冲刺<5/10>
			
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第五天(05.23) 作业正文 如下 其他参考文献 ... B ...
 - Module Error (from ./node_modules/eslint-loader/index.js):解决办法
			
vue启动项目报如下错误: Failed to compile. ./src/components/Vcontent.vue Module Error (from ./node_modules/esl ...
 - 乌班图设置C++11
			
zsh: echo "alias g++='g++ -std=c++11'" >> ~/.zshrc source ~/.zshrc bash: echo " ...
 - 专家解读:利用Angular项目与数据库融合实例
			
摘要:面对如何在现有的低版本的框架服务上,运行新版本的前端服务问题,华为云前端推出了一种融合方案,该方案能让独立的Angular项目整体运行在低版本的框架服务上,通过各种适配手段,让Angular项目 ...
 - weblogic高级进阶之查看日志
			
域的日志位于 D:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\logs 名字是base_domai ...