领接矩阵的K次幂便是从i到j走K步能到达的方案数。
注意可能有重边,要去重。
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
using namespace std;
struct matrix
{
__int64 mat[22][22];
};
matrix matmul(matrix a,matrix b,int n,int m)
{
int i,j,k;
matrix c;
memset(c.mat,0,sizeof(c.mat));
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
for(k=0; k<n; k++)
{
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
c.mat[i][j]%=m;
}
}
}
return c;
}
matrix matpow(matrix a,int k,int n,int m)
{
matrix b;
int i;
memset(b.mat,0,sizeof(b.mat));
for(i=0; i<n; i++) b.mat[i][i]=1;
while(k)
{
if(k&1) b=matmul(a,b,n,m);
a=matmul(a,a,n,m);
k>>=1;
}
return b;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),(n+m))
{
matrix a,b,ans;
memset(a.mat,0,sizeof(a.mat));
int t;
while(m--)
{
int x,y;
cin>>x>>y;
a.mat[x][y]=1;
}
cin>>t;
while(t--)
{
int x,y,k;
cin>>x>>y>>k;
b=a;
ans=matpow(b,k,n,1000);
printf("%I64d\n",ans.mat[x][y]%1000);
}
}
}