题意:
n个点,m条边。输出A到B恰好经过k步的方案数。
分析:
这是前面提到的快速矩阵幂用在有向图的裸题。(也可以用DP写)
/*//
快速矩阵幂 HDU 2157
//*/
#include <cstdio>
#include <cstring>
#include <cmath>
int n,mod=1000;
typedef long long LL;
struct Matrix
{
LL m[21][21];
void clear()
{
memset(m,0,sizeof(m));
}
}E, Z;
Matrix Mut(Matrix A, Matrix B)
{
Matrix ans;
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
{
ans.m[i][j] = 0;
for (int k = 0; k<n; k++)
{
ans.m[i][j] += ((A.m[i][k])*(B.m[k][j]));
ans.m[i][j]%=mod;
}
}
return ans;
}
Matrix Pow(Matrix A, LL b)
{
Matrix t = A, ans = E;
while (b)
{
if (b % 2)
ans = Mut(ans, t);
b /= 2;
t = Mut(t, t);
}
return ans;
}
int main()
{
// freopen("in.txt", "r", stdin);
Matrix A;
int m,x,y;
int q,a,b,k;
while(scanf("%d %d",&n,&m)!=EOF&&(n+m))
{
A.clear();
for(int i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
A.m[x][y]=1;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
E.m[i][j]=(i==j);
scanf("%d",&q);
while(q--)
{
scanf("%d %d %d",&a,&b,&k);
Matrix ans=Pow(A,k);
printf("%d\n",ans.m[a][b]);
}
}
return 0;
}