雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

矩阵乘法——hdu2157

Posted on 2011-07-25 09:16  huhuuu  阅读(459)  评论(0编辑  收藏  举报

裸的矩阵乘法

注意点:

步数为0时,A,B点相同时路有1条

步数为0时,A,B点不相同时路有条0条

View Code
#include<stdio.h>
#include
<string.h>

struct data
{
int map[29][29];
}mat[
29];

int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n||m)
{
int i,j;
memset(mat,
0,sizeof(mat));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
mat[
0].map[i][j]=0;
mat[
1].map[i][j]=0;
}
}
for(i=0;i<m;i++)
{
int a,b;
scanf(
"%d%d",&a,&b);
mat[
1].map[a][b]=1;
mat[
0].map[a][b]=1;
}
int t;
scanf(
"%d",&t);

int s,k;
for(s=2;s<=20;s++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
int all=0;
for(k=0;k<n;k++)
{
all
+=(mat[0].map[i][k]*mat[s-1].map[k][j])%1000;
}
mat[s].map[i][j]
=all%1000;
}
}
}

for(i=0;i<t;i++)
{
int a,b,c;

scanf(
"%d%d%d",&a,&b,&c);
if(c==0&&(a!=b)){printf("0\n");continue;};//注意点
if(c==0&&(a==b)){printf("1\n");continue;};//
printf("%d\n",mat[c].map[a][b]%1000);
}
}
return0;
}