hdoj 2157 How many ways??

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2157 

解题思路:矩阵快速幂

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int n;  //n个点,对应nxn矩阵
 5 
 6 struct Matrix{
 7     int a[20][20];
 8 }res;
 9 
10 Matrix multiply(Matrix x,Matrix y){
11     Matrix temp;
12     for(int i=0;i<n;i++){
13         for(int j=0;j<n;j++){
14             temp.a[i][j]=0;
15             for(int k=0;k<n;k++) temp.a[i][j]+=x.a[i][k]*y.a[k][j];
16             temp.a[i][j]%=1000;
17         }
18     }
19     return temp;
20 }
21 
22 void calc(Matrix origin,int k){
23     while(k){
24         if(k&1) res=multiply(res,origin);
25         k>>=1;
26         origin=multiply(origin,origin);
27     }
28 }
29 
30 int main(){
31     int m,t,A,B,k,i,j;
32     Matrix origin;
33     while(cin>>n>>m,n||m){
34 
35         //构造对应的矩阵
36         for(i=0;i<n;i++){
37             for(j=0;j<n;j++) origin.a[i][j]=0;
38         }
39         while(m--){
40             cin>>i>>j;
41             origin.a[i][j]=1;
42         }
43 
44         cin>>t;
45         while(t--){
46             cin>>A>>B>>k;
47 
48             //初始化res为单位矩阵
49             for(i=0;i<n;i++){
50                 for(j=0;j<n;j++) res.a[i][j]=0;
51                 res.a[i][i]=1;
52             }
53 
54             calc(origin,k);
55             cout<<res.a[A][B]<<endl;
56         }
57     }
58     return 0;
59 }

 

posted on 2013-06-17 23:23  SCNU20102200088  阅读(242)  评论(0编辑  收藏  举报

导航