hdu 2157 How many ways??

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

 

你可能感兴趣的:(HDU)