裸的矩阵乘法
注意点:
步数为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;
}