题目链接: 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 }

 

posted on 2012-05-08 10:54  奋斗青春  阅读(301)  评论(0编辑  收藏  举报