zoj 3497 Mistwald (矩阵应用)
2015-04-18 21:02
218 查看
/* 邻接矩阵A的k次幂得到的新矩阵B中,bij表示ai到aj长度为k的通路数。 上面的方法计算的是任意两点通路数, 而本题目要求终点不能有出边, 只要把终点那一行全部置为0就ok, 这里不求通路数,改为求能否k步到达终点。 */ # include <stdio.h> # include <algorithm> # include <string.h> # include <math.h> using namespace std; struct node { int m1[50][50]; }; int n,m; struct node a,I; node f(node a1,node a2) { int i,j,k; node a3; for(i=1; i<=n*m; i++) { for(j=1; j<=n*m; j++) { a3.m1[i][j]=0; for(k=1; k<=n*m; k++) a3.m1[i][j]+=(a1.m1[i][k]*a2.m1[k][j]); } } return a3; } node quick(int x) { node mm=a; node b=I; while(x) { if(x&1) b=f(b,mm); mm=f(mm,mm); x=x>>1; } return b; } int main() { int i,j,t,x1,x2,x3,x4,y1,y2,y3,y4; while(~scanf("%d",&t)) { while(t--) { scanf("%d%d",&n,&m); getchar(); memset(a.m1,0,sizeof(a.m1)); memset(I.m1,0,sizeof(I.m1));//单位矩阵 for(i=1; i<=n*m; i++) I.m1[i][i]=1; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { scanf("((%d,%d),(%d,%d),(%d,%d),(%d,%d))",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); getchar(); if((i-1)*m+j==n*m) continue; a.m1[(i-1)*m+j][(x1-1)*m+y1]=1; a.m1[(i-1)*m+j][(x2-1)*m+y2]=1; a.m1[(i-1)*m+j][(x3-1)*m+y3]=1; a.m1[(i-1)*m+j][(x4-1)*m+y4]=1; } } int q,k; scanf("%d",&q); while(q--) { scanf("%d",&k); node b=quick(k); if(b.m1[1][n*m]==0) printf("False\n"); else { for(i=1; i<=n*m; i++) { if(b.m1[1][i]) break; } if(i==n*m)///只能到达终点 printf("True\n"); else///还可以到达其他点 printf("Maybe\n"); } } printf("\n"); } } return 0; }
相关文章推荐
- ZOJ 3497 Mistwald(矩阵快速幂)
- ZOJ 3497 Mistwald(矩阵快速幂)
- 【已解决】zoj 3497 Mistwald 矩阵快速幂
- ZOJ 3497 Mistwald(矩阵快速幂)
- ZOJ 3497 Mistwald 矩阵
- zoj 3497 Mistwald 矩阵快速幂
- zoj 3497 Mistwald 矩阵快速幂
- zoj 3497 Mistwald 矩阵快速幂
- ZOJ 3497 Mistwald【矩阵快速幂】【图论】
- ZOJ 3497 Mistwald (矩阵快速幂解决类似图论问题)
- ZOJ 3497-Mistwald(矩阵快速幂)
- zoj 3497 Mistwald(矩阵快速幂)
- 矩阵快速幂ZOJ - 3497(矩阵在图的联通
- ZOJ 3497 Mistwald
- 矩阵快速幂ZOJ - 3497(矩阵在图的联通
- ZOJ 3497 Mistwald
- 矩阵快速幂ZOJ - 3497(矩阵在图的联通
- ZOJ 3497 Mistwald
- 矩阵快速幂ZOJ - 3497(矩阵在图的联通
- 矩阵快速幂ZOJ - 3497(矩阵在图的联通