zoj3497 Mistwald(矩阵快速幂)
题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点。也就是说从起点出发,走一条长度为P的路径,路径中间点不能经过终点(但可以反复经过其他点)。如果从起点出发P步后,不能到达终点,就是False,如果可以到达终点也可以到其他别的点,就是Maybe,如果P步后只能到达终点(到别的点没有长度为P的路径),则是Yes。
样例输入意思:四个坐标分别为,m*n矩阵中的坐标,通过次计算出每个节点对应的出口,然后建图。
分析:图的邻接矩阵A的 p次方Ap中为1的元素(i,j)表示节点i到节点j有一条长度为p的路径(经历的节点可能重复)。要理解矩阵的含义,两个矩阵相乘如果(x,y)元素为1,而(y,z)元素为1,则结果(x,z)元素为1,这表明通过y把x和z连起来了。而题目要求经过终点就不能走了,所以在做矩阵乘法时,需要把(x,n-1) (n-1,y)这样决定的(x,y)去掉。(n-1表示终点)。做乘法时,中间点小心一点就好了。矩阵乘法和floyd在本质上是一样的……
Orz..矩阵乘法还可以写成松弛操作。(是我辣鸡了)

矩阵的P次方运用的是经典的log(P)的算法。最后看一下结果矩阵的首行(0行)里面有几个1,以及(0,n-1)是不是1,来决定结果。
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 30
using namespace std;
struct mat{
int a[maxn][maxn];
};
mat map;
int mul;
mat mat_mul(mat x,mat y){
mat ans;
memset(ans.a,,sizeof(ans.a));
for (int i=;i<=mul;i++)
for (int j=;j<=mul;j++)
for (int k=;k<=mul;k++){
ans.a[i][j]+=x.a[i][k]*y.a[k][j];
}
return ans;
}
mat mat_pow(mat map,int k){ //map的k次方
mat c=map,res=map;
k--;
while (k){
if (k&) res=mat_mul(res,c);
k>>=;
c=mat_mul(c,c);
}
return res;
}
int main(){
int t,m,n,q;char ch;
int xx;
int x[],y[];
scanf("%d",&t);
while (t--){
scanf("%d%d",&m,&n);scanf("%c",&ch);
mul=m*n;
memset(map.a,,sizeof(map.a));
for (int i=;i<=m;i++){
for (int j=;j<=n;j++){
scanf("((%d,%d),(%d,%d),(%d,%d),(%d,%d))",&x[],&y[],&x[],&y[],&x[],&y[],&x[],&y[]);
scanf("%c",&ch);
if (i==m && j==n) continue; //途中路径不能经过终点
for (int k=;k<;k++){
map.a[(i-)*n+j][(x[k]-)*n+y[k]]=;
}
}
}
scanf("%d",&q);
while (q--){
scanf("%d",&xx);
mat S;
if (xx) S=mat_pow(map,xx);
else {
memset(S.a,,sizeof(S.a));
for (int i=;i<=mul;i++) S.a[i][i]=;
}
if (!S.a[][mul]) printf("False\n");
else {
int flag=;
for (int i=;i<mul;i++){
if (S.a[][i]){
flag=;
break;
}
}
if (flag) printf("Maybe\n");
else printf("True\n");
}
}
printf("\n");
}
return ;
}
PS.迷之TLE无数发。各种迷。最后是因为快速幂姿势和别人有所不同,矩阵的0次方需要特判赋值为单位矩阵。orz....太菜了。
zoj3497 Mistwald(矩阵快速幂)的更多相关文章
- Educational Codeforces Round 14E. Xor-sequences(矩阵快速幂)
		
传送门 题意 给定序列,从序列中选择k(1≤k≤1e18)个数(可以重复选择),使得得到的排列满足\(x_i与x_{i+1}\)异或的二进制表示中1的个数是3的倍数.问长度为k的满足条件的序列有多少种 ...
 - 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
		
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
 - 51nod 算法马拉松18 B 非010串 矩阵快速幂
		
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
 - 51nod 1113 矩阵快速幂
		
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
 - 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
		
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
 - HDU5950(矩阵快速幂)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...
 - 51nod 1126 矩阵快速幂 水
		
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
 - hdu2604(递推,矩阵快速幂)
		
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
 - 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
		
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
 - hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律
		
http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...
 
随机推荐
- 用 npm 安装删除模块
			
npm安装模块 [npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录: [npm install -g xxx]利用npm安装全局模块xxx: 本地安装时将模块写入pac ...
 - OSGi karaf-maven-plugin
			
karaf-maven-plugin 1. 配制 karaf 启动时加载 bundle 项目中需要在 karaf 中集成 cxf-dosgi-discovery-distributed 特性,所以需要 ...
 - Cookis与文件缓存的区别
			
我是一位顶尖的网络专家.稍后更新...
 - client.HConnectionManager$HConnectionImplementation: Can't get connection to ZooKeeper: KeeperErrorCode = ConnectionLoss for /hbase
			
解决方法:hbase 未成功启动 1.关闭防火墙:service iptables stop 2.start-hbase.sh
 - 2018.10.23 NOIP训练 Leo的组合数问题(组合数学+莫队)
			
传送门 好题. 考察了莫队和组合数学两个知识板块. 首先需要推出单次已知n,mn,mn,m的答案的式子. 我们令f[i]f[i]f[i]表示当前最大值为第iii个数的方案数. 显然iii之后的数都是单 ...
 - 2018.09.27 codeforces618F. Double Knapsack(抽屉原理+构造)
			
传送门 思维题. 考虑维护两个数列的前缀和a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an和b1,b2,b3,...,bnb_1,b_2,b_ ...
 - jdk10运行springboot项目出现:Type javax.xml.bind.JAXBContext not present
			
项目由openjdk8.0迁移到jdk10导致的 原因:java9模块化的概念使得JAXB默认没有加载: jaxb-api是存在jdk中的,只是默认没有加载而已,手动引入即可. 推荐方式: <! ...
 - ArcGIS Desktop python Add-in 测试一个插件
			
a)制作一个插件文件 先找到工作目录,双击运行makeaddin.py脚本.这个脚本拷贝所有插件需要的文件和文件夹并在工作目录形成一个压缩文件.该压缩文件名为工作目录名称加上".esriad ...
 - (KMP)Count the string -- hdu -- 3336
			
http://acm.hdu.edu.cn/showproblem.php?pid=3336 Count the string Time Limit: 2000/1000 MS (Java/Other ...
 - 几个经典的数学库之一学习---VCGlib(1)
			
1. VCG Libary是Visulization and Computer Graphics Libary(可视化与计算机图形学库)的缩写,是一个开源的C++模板库,用于三角网格和四面体网格的控制 ...