矩阵路径方案的裸题,注意多组输入就好
这里有一个需要说明的知识点是,一个01的邻接矩阵经过k次幂之后map[i][j]就是从i->j经过k条路径的方案
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=1000;
struct mtix
{
int w[50][50];
mtix(){memset(w,0,sizeof(w));}
}a,b;
int n,m,q;
mtix mul(mtix e,mtix f)
{
mtix c;
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
for (int k=0;k<n;k++)
c.w[i][j]=(c.w[i][j]+e.w[i][k]*f.w[k][j])%mod;
return c;
}
mtix mpow(int y)
{
mtix e=b,f=a;
for (;y;f=mul(f,f),y>>=1)
if (y&1) e=mul(e,f);
return e;
}
int main()
{
for (int i=0;i<=50;i++) b.w[i][i]=1;
while (~scanf("%d%d",&n,&m)&&n)
{
memset(a.w,0,sizeof(a.w));
int x,y,z;
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);a.w[x][y]=1;
}
scanf("%d",&q);
while (q--)
{
scanf("%d%d%d",&x,&y,&z);
mtix ans=mpow(z);
cout<<ans.w[x][y]<<endl;
}
}
return 0;
}