[SCOI2009] 迷路
[SCOI2009] 迷路
题意
给出一张带权有向图,从
中途不能停留,求有多少种方案。
思路
先考虑边权为
所以
再考虑边权不为
考虑把一个点
将
如果点
因为只有
这样保证了
这样我们就把原图转化为了边权为
时间复杂度:
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
const int M = 2009;
int n, t, cnt, f[N][N], id[N][N];
char str[N];
struct Matrix {
int h, l, a[N][N];
void init(int H, int L, bool f) {
h = H, l = L;
for (int i = 1; i <= h; i ++)
for (int j = 1; j <= l; j ++) {
if (!f) a[i][j] = 0;
else if (i == j) a[i][j] = 1;
}
}
Matrix operator * (const Matrix& b)const{
Matrix ret;
ret.init(h, b.l, 0);
for (int i = 1; i <= h; i ++)
for (int j = 1; j <= b.l; j ++)
for (int k = 1; k <= l; k ++)
ret.a[i][j] += a[i][k] * b.a[k][j],
ret.a[i][j] %= M;
return ret;
}
void input() {
for (int i = 1; i <= h; i ++)
for (int j = 1; j <= l; j ++)
cin >> a[i][j];
}
void output() {
for (int i = 1; i <= h; i ++) {
for (int j = 1; j <= l; j ++)
cout << a[i][j] << ' ';
cout << '\n';
}
}
} A, B;
Matrix qpow(Matrix a, int p) {
Matrix ret;
ret.init(a.h, a.l, 1);
for (; p; p >>= 1, a = a * a)
if (p & 1) ret = ret * a;
return ret;
}
int main() {
scanf("%d%d", &n, &t);
for (int i = 1; i <= n; i ++) {
for (int j = 0; j <= 9; j ++) {
id[i][j] = ++ cnt;
}
}
for (int i = 1; i <= n; i ++) {
scanf("%s", str + 1);
for (int j = 1; j <= n; j ++) {
if (str[j] == '0') continue;
int w = str[j] - '0';
f[id[i][0]][id[j][w - 1]] = 1;
}
}
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= 9; j ++)
f[id[i][j]][id[i][j - 1]] = 1;
A.h = A.l = cnt;
for (int i = 1; i <= cnt; i ++)
for (int j = 1; j <= cnt; j ++)
A.a[i][j] = f[i][j];
A = qpow(A, t);
printf("%d\n", A.a[id[1][0]][id[n][0]]);
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18415016,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效