题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2157
矩阵乘法。
注意当k=0时 a 与 b 相等不相等的两种情况。
数据好像有重边,重边只算一次就好。
code:
View Code
1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # define MOD 1000 5 # define N 25 6 struct matrix{ 7 int map[N][N]; 8 }; 9 int n; 10 matrix power(matrix ans1,matrix ans2) 11 { 12 int i,j,k,num,flag; 13 matrix ans; 14 for(i=0;i<n;i++) 15 { 16 for(j=0;j<n;j++) 17 { 18 ans.map[i][j]=-1; 19 num=0; 20 flag=0; 21 for(k=0;k<n;k++) 22 { 23 if(ans1.map[i][k]!=-1 && ans2.map[k][j]!=-1) 24 { 25 num+=ans1.map[i][k]*ans2.map[k][j]; 26 flag=1; 27 } 28 num%=MOD; 29 } 30 if(flag==1) ans.map[i][j]=num; //开始不能走的我是初始化为0的,那样方便一点, 31 //但是不太好理解,因为0有两种情况,不能走的 和 取模了,初始化为-1方便理解。 32 33 } 34 } 35 return ans; 36 } 37 int main() 38 { 39 int i,j,m,a,b,T,k; 40 matrix ans,init; 41 while(scanf("%d%d",&n,&m)!=EOF) 42 { 43 if(n==0 && m==0) break; 44 for(i=0;i<n;i++) 45 for(j=0;j<n;j++) 46 init.map[i][j]=-1; 47 for(i=1;i<=m;i++) 48 { 49 scanf("%d%d",&a,&b); 50 init.map[a][b]=1; 51 //if(init.map[a][b]==-1) init.map[a][b]=1; 52 //else init.map[a][b]++;如果这样写的话就错了,可能数据有重边 53 } 54 scanf("%d",&T); 55 while(T--) 56 { 57 scanf("%d%d%d",&a,&b,&k); 58 if(k==0 && a!=b) printf("0\n"); 59 else if(k==0 && a==b) printf("1\n"); 60 else 61 { 62 ans=init; 63 for(i=1;i<k;i++) 64 ans=power(ans,init); 65 if(ans.map[a][b]==-1) printf("0\n"); 66 else printf("%d\n",ans.map[a][b]%MOD); 67 } 68 } 69 } 70 return 0; 71 }