题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点。也就是说从起点出发,走一条长度为P的路径,路径中间点不能经过终点(但可以反复经过其他点)。如果从起点出发P步后,不能到达终点,就是False,如果可以到达终点也可以到其他别的点,就是Maybe,如果P步后只能到达终点(到别的点没有长度为P的路径),则是Yes。

题目看了看天没看懂

解决方法非独立思考

借鉴以下博客

http://blog.csdn.net/sdjzujxc/article/details/8720573

不过题解还是要自己写

想象以下矩阵相乘的方程

c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j]);

假设 a b相等

是否可以看做 i到j的路径数目=i到k的路径数目*k到j的路径数目?

所以走p次的各个点到各个点的方案数 就是

保存在了A^p这个矩阵中,利用矩阵快速幂求出

若A[0][m*n-1]>0 说明一定可以到终点

若A[0][0]~A[0][m*n-2]>0且A[0][m*n-1]>0 代表可能到终点

A[0][m*n-1]=0 不能到终点

不过要注意 m*n-1只能走一次 即终点只能走一次 所以m*n-1 不能作为矩阵乘法中的k出现

代码如下:

/*
注意不能计算 A[i][m*n-1]*B[m*n-1][j];
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define LL long long
#define oo 0x13131313
using namespace std;
LL M,N,k,m;
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
struct node
{
LL mat[30][30];
void clear() {memset(mat,0,sizeof(mat));}
void ret() {
clear();
for(int i=0;i<30;i++)
mat[i][i]=1;
}
};
node A;
void input()
{
int x1,y1,x2,y2,x3,y3,x4,y4;
A.clear();
scanf("%d%d\n",&M,&N);
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
{
scanf("((%d,%d),(%d,%d),(%d,%d),(%d,%d)) ",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
x1--,y1--,x2--,y2--,x3--,y3--,x4--,y4--;
A.mat[i*N+j][x1*N+y1]=1;
A.mat[i*N+j][x2*N+y2]=1;
A.mat[i*N+j][x3*N+y3]=1;
A.mat[i*N+j][x4*N+y4]=1;
}
}
node matmult(node a,node b,LL mod)
{
node c;c.clear();
for(int i=0;i<(N*M);i++)
for(int j=0;j<(N*M);j++)
for(int k=0;k<(N*M-1);k++)
c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod;
return c;
}
node quickmatpow(node a,LL n,LL mod)
{
node c;c.ret();
while(n!=0)
{
if(n&1==1) c=matmult(c,a,mod);
n=n>>1;
a=matmult(a,a,mod);
}
return c;
}
void solve()
{
int ok,ok1;
node c;
int Q,P;
cin>>Q;
while(Q--)
{
ok=0;ok1=0;
cin>>P;
c=quickmatpow(A,P,21323);
for(int i=0;i<M*N-2;i++)
if(c.mat[0][i]>0) ok=1;
if(c.mat[0][M*N-1]>0) ok1=1;
if(ok&&ok1) printf("Maybe\n");
else if(ok1) printf("True\n");
else if(!ok1) printf("False\n");
}
printf("\n");
}
int main()
{
//init();
int T;
cin>>T;
while(T--)
{
input();
solve();
}
return 0;
}

【矩阵乘法经典应用】【ZOJ3497】【Mistwa】的更多相关文章

  1. NYOJ298 点的变换 【矩阵乘法经典】

    任意门:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=298 点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 ...

  2. poj3233Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23187   Accepted: ...

  3. Poj 3233 Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Description Given a n × n matrix A and ...

  4. 学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

    本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足 ...

  5. 【转】Matrix67:十个利用矩阵乘法解决的经典题目

    好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的 ...

  6. poj3233之经典矩阵乘法

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 12346   Accepted:  ...

  7. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  8. 【BZOJ-1898】Swamp 沼泽鳄鱼 矩阵乘法

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1012  Solved: 566[Submit][S ...

  9. 【poj3070】矩阵乘法求斐波那契数列

    [题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [ ...

随机推荐

  1. Mac 删除Openfire

    首先,确保你已经关掉了openfire 打开终端 (在应用程序-->实用工具-->) 输入以下命令 sudo rm -rf /Library/PreferencePanes/Openfir ...

  2. Java Base64编码与图片互转

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  3. ssh整合启动tomcat报java.lang.ClassNotFoundException: org.apache.commons.lang.xwork.StringUtils

    今天搭建了一个ssh项目环境,整合后,访问项目首页,登录不进去,控制台报错,后来调试代码后,在获取数据库数据后,返回到action时,又进入了action导致死循环,其实这里是两个问题,控制台报错如下 ...

  4. 【考虑周全+数学变形】【11月赛】Is it a fantastic matrix?

    Is it a fantastic matrix? Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/ ...

  5. spring boot1.3.0版本及以上版本profile指定参数无法被打入

    现象:小于1.3.0版本如1.2.6的spring boot, 当指定profile进行参数打入的时候,发现没有问题,但是比如改用1.3.0,1.3.1及其以上版本的时候,发现参数打不进去,经过比对s ...

  6. jQuery中$.getJSON的返回值问题

    在使用$.getJSON获得数据库的返回值后,想将该值return传给其他函数.结果遇到问题. $.getJSON(url, data, function(result) { return resul ...

  7. js库开发--参数传递及方法修改

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  8. WindowsForm 打印

    打印: 打印对话框:printdialog 页面设置:pagesetupdialog 这两个对话框都需要通过设置printdocument来指定打印对象 printdocument:打印对象,必须要有 ...

  9. OpenCV学习笔记(一)安装及运行第一个OpenCV程序

    1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以 ...

  10. 调试 JavaScript 脚本

    随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它.Chrome DevTools 提供了一系列实用的工具使得调试 JavaSc ...