您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: