思路分析:其实我们在很久之前曾经做过一道类似的题,那道题要求我们求的是经过k个点的最短路,我们在那道题用的是矩阵乘法和Floyd,这道题问的我们是经过k个点的路径一共有多少条,我们可以用类似的方法进行计算,我们设在两点a,b之间到中间点c的路径分别有x,y条,那么我们从a到b的路径就一共有x*y条,这根据我们刚刚学过的乘法分配计数原理可以得出。之后这道题和那道题就很相似了。
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 #include<memory> 6 using namespace std; 7 const int N=31; 8 const int Mod=1000; 9 int n; 10 struct Node{ 11 int m[N][N]; 12 Node(){ 13 memset(m,0,sizeof(m)); 14 } 15 Node friend operator*(Node a,Node b){ 16 Node d; 17 for(int i=0;i<n;i++) 18 for(int j=0;j<n;j++) 19 for(int k=0;k<n;k++) 20 d.m[i][j]=(d.m[i][j]+a.m[i][k]*b.m[k][j])%Mod; 21 return d; 22 } 23 Node friend operator^(Node a,int k){ 24 Node d; 25 for(int i=0;i<n;i++) d.m[i][i]=1; 26 while(k){ 27 if(k&1) d=d*a; 28 a=a*a; 29 k>>=1; 30 } 31 return d; 32 } 33 }; 34 int main() 35 { 36 int m,k,i,x,y,q; 37 while(~scanf("%d%d",&n,&m)){ 38 if(m==0&&n==0) return 0; 39 Node Map; 40 for(i=0;i<m;i++){ 41 scanf("%d%d",&x,&y); 42 Map.m[x][y]=1; 43 } 44 scanf("%d",&q); 45 for(i=0;i<q;i++){ 46 scanf("%d%d%d",&x,&y,&k); 47 Node ans; 48 ans=Map^k; 49 printf("%d ",ans.m[x][y]); 50 } 51 } 52 return 0; 53 }