您的位置:首页 > 其它

hdu 2157 How many ways??【矩阵快速幂路径问题】

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

题目链接

思路:

离散的知识(关系闭包):构建一个01可达矩阵,k次幂后的[x][y]位置的值表示x->y经过k个位置的路径数。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
const int mod = 1000;
using namespace std;
typedef long long LL;

struct mat {
int mapp[20][20];
}ans, base;

mat mat_mul(mat A, mat B) {
mat C;
memset(C.mapp, 0, sizeof(C.mapp));
for(int i = 0; i < 20; i++) {
for(int j = 0; j < 20; j++) {
for(int k = 0; k < 20; k++) {
C.mapp[i][k] = (C.mapp[i][k] + A.mapp[i][j] * B.mapp[j][k]) % mod;
}
}
}
return C;
}

void mat_pow(mat A, int b) {
memset(ans.mapp, 0, sizeof(ans.mapp));
for(int i = 0; i < 20; i++) {
ans.mapp[i][i] = 1;
}
while(b) {
if(b & 1) ans = mat_mul(ans, A);
A = mat_mul(A, A);
b >>= 1;
}
}

int main() {
int n, m, k, q, x, y;
while(scanf("%d %d", &n, &m) && (n + m)) {
memset(base.mapp, 0, sizeof(base.mapp));
while(m--) {

scanf("%d %d", &x, &y);
base.mapp[x][y] = 1;
}
scanf("%d", &q);
while(q--) {
scanf("%d %d %d", &x, &y, &k);
mat_pow(base, k);
printf("%d\n", ans.mapp[x][y] % mod);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: