【BZOJ 1297】[SCOI2009]迷路
【链接】  我是链接,点我呀:) 
 【题意】
在这里输入题意
【题解】
如果点与点之间的距离都是1的话。
那么T次方之后的矩阵上a[1][n]就是所求答案了。
但是这一题的边权可能会大于1
但最多为10
很容易想到拆点。
我们把每个点又重新分为9个点。
x1,x2,x3..x9
然后对于所有的i,从xi向x[i-1]连一条单向边。
然后如果x和y有一条长度为z的边
那么从x[1]向x[z-1]连一条边。
这样从x[1]走z条边才能到y[1]
然后在这个新的图所构成的矩阵上。
把它做一下矩阵乘法。
T次方
(这种方法,类似于强行把原图拆成边权都是1的图。用旧的方法,解决新的问题。
(很巧妙的转换
然后输出对应的位置就好。
【代码】
#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define ms(x,y) memset(x,y,sizeof x)
#define rson mid+1,r,rt<<1|1
using namespace std;
const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int N = 100;
const int G = 100;       //矩阵大小
const LL MOD = 2009;    //模数
struct MX
{
    int v[G+5][G+5];
    void O() { ms(v, 0); }
    void E() { ms(v, 0); for (int i = 0; i <= G; ++i)v[i][i] = 1; }
    void P()//输出矩阵
    {
        for (int i = 0; i <= G; ++i)
        {
            for (int j = 0; j <= G; ++j)printf("%d ", v[i][j]); puts("");
        }
    }
    MX operator * (const MX &b) const//矩阵乘法
    {
        MX c; c.O();
        for (int k = 0; k <= G; ++k)
        {
            for (int i = 0; i <= G; ++i) if (v[i][k])
            {
                for (int j = 0; j <= G; ++j)
                {
                    c.v[i][j] = (c.v[i][j] + (LL)v[i][k] * b.v[k][j]) % MOD;
                }
            }
        }
        return c;
    }
    MX operator ^ (LL p) const//矩阵快速幂
    {
        MX y; y.E();
        MX x; memcpy(x.v, v, sizeof(v));
        while (p)
        {
            if (p&1) y = y*x;
            x = x*x;
            p>>=1;
        }
        return y;
    }
}a;
int n,t;
char s[N+10][N+10];
int main(){
	#ifdef LOCAL_DEFINE
	    freopen("rush_in.txt", "r", stdin);
	#endif
	ios::sync_with_stdio(0),cin.tie(0);
    cin >> n >> t;
    for (int i = 1;i <= n;i++) cin >> (s[i]+1);
    for (int i = 1;i <= n;i++)
        for (int j = 8;j >= 1;j--)
            a.v[(i-1)*9+j][(i-1)*9+j-1] = 1;
    for (int i = 1;i <= n;i++)
        for (int j = 1;j <= n;j++)
            if (s[i][j]>'0'){
                int x = s[i][j]-'0';
                a.v[(i-1)*9][(j-1)*9+x-1] = 1;
            }
    a = a^(t);
    cout<<a.v[(1-1)*9][(n-1)*9]<<endl;
	return 0;
}
【BZOJ 1297】[SCOI2009]迷路的更多相关文章
- BZOJ 1297: [SCOI2009]迷路( dp + 矩阵快速幂 )
		递推式很明显...但是要做矩阵乘法就得拆点..我一开始很脑残地对于每一条权值v>1的边都新建v-1个节点去转移...然后就TLE了...把每个点拆成9个就可以了...时间复杂度O((9N)^3* ... 
- [BZOJ 1297][SCOI2009]迷路
		1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1418 Solved: 1017[Submit][Status ... 
- BZOJ 1297: [SCOI2009]迷路 [矩阵快速幂]
		Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ... 
- 1297: [SCOI2009]迷路
		1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 652 Solved: 442[Submit][Status] ... 
- 【BZOJ】1297: [SCOI2009]迷路
		[题意]给定n个点的有向带边权图,求0到n-1长度恰好为T的路径数.n<=10,T<=10^9,边权1<=wi<=9. [算法]矩阵快速幂 [题解]这道题的边权全部为1时,有简 ... 
- 1297. [SCOI2009]迷路【矩阵乘法】
		Description windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1. 现在给出该有向图,你能告诉windy总共有多少种不同 ... 
- 【矩阵快速幂】bzoj1297 [SCOI2009]迷路
		1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1407 Solved: 1007[Submit][Status ... 
- [Bzoj1297][Scoi2009 ]迷路 (矩阵乘法 + 拆点)
		1297: [SCOI2009]迷路 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1385 Solved: 993[Submit][Status] ... 
- 【BZOJ1297】[SCOI2009]迷路(矩阵快速幂)
		[BZOJ1297][SCOI2009]迷路(矩阵快速幂) 题面 BZOJ 洛谷 题解 因为边权最大为\(9\),所以记录往前记录\(9\)个单位时间前的.到达每个点的方案数就好了,那么矩阵大小就是\ ... 
- B20J_1297_[SCOI2009]迷路_矩阵乘法
		B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ... 
随机推荐
- Updates were rejected because the remote contains work that you do(gitee报错解决方案)
			今天向Gitee远程仓库提交本地项目文件时,遇到了下列错误,很是郁闷 正在推送 1203笔记本Error: failed to push some refs to 'https://gitee.com ... 
- The Basics of Numpy
			在python语言中,Tensorflow中的tensor返回的是numpy ndarray对象. Numpy的主要对象是齐次多维数组,即一个元素表(通常是数字),所有的元素具有相同类型,可以通过有序 ... 
- [Beginning SharePoint Designer 2010]Chapter4 发布页面
			本章概要: 1.SharePoint中的Web内容管理 2.SharePoint发布系统的特性 3.SharePoint发布页面的组成 4.母板页 5.如何构建页面布局和他们潜在的内容类型 
- JavaWeb应用中的身份验证(声明式)——基于表单的身份认证
			容器管理安全最普遍的类型建立在基于表单的身份验证方式上. 通过这样的方式,server自己主动将尚未验证的用户重定向到一个HTML表单.检查他们的username和password,决定他们属于哪个角 ... 
- 生成静态页java代码
			package com.fang.news.test; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ... 
- Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)
			近期在读Hadoop#Yarn部分的源代码.读到状态机那一部分的时候,感到enmu的使用方法实在是太灵活了,在给并发编程网翻译一篇文章的时候,正好碰到一篇这种文章.就赶紧翻译下来,涨涨姿势. 原文链接 ... 
- 英语发音规则---M字母
			英语发音规则---M字母 一.总结 一句话总结: 1.M发[m]音? monkey ['mʌŋkɪ] n. 猴子:顽童 come [kʌm] vi. 来 tomato [tə'mɑːtəʊ] n. 番 ... 
- 存储概念解析:NAS与SAN的区别
			目前存储网络技术领域中的两个主旋律是SAN(存储区域网络)和NAS(网络连接区域存储),两者都宣称是解决现代企业高容量数据存储需求的最佳选择. 正如在餐厅就餐时大厨不会为您传菜,跑堂不会为您烹制鲜橙烩 ... 
- NEUOJ 1702 撩妹全靠魅力值 (三维偏序)
			题目链接:http://acm.neu.edu.cn/hustoj/problem.php?id=1702 题目大意:就是问每个人三个属性同时不低于另外几个人....人不分先后 经典的三维偏序问题 解 ... 
- BZOJ 3729 splay维护DFS序+博弈论
			思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By Sirius ... 
