How many ways??

How many ways??_第1张图片

 

 How many ways??_第2张图片

 

 How many ways??_第3张图片

 

 

思路分析:其实我们在很久之前曾经做过一道类似的题,那道题要求我们求的是经过k个点的最短路,我们在那道题用的是矩阵乘法和Floyd,这道题问的我们是经过k个点的路径一共有多少条,我们可以用类似的方法进行计算,我们设在两点a,b之间到中间点c的路径分别有x,y条,那么我们从a到b的路径就一共有x*y条,这根据我们刚刚学过的乘法分配计数原理可以得出。之后这道题和那道题就很相似了。

代码:

 

 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 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)
18          for(int j=0;j)
19           for(int k=0;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;i1;
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){
41             scanf("%d%d",&x,&y);
42             Map.m[x][y]=1;
43         }
44         scanf("%d",&q);
45         for(i=0;i){
46              scanf("%d%d%d",&x,&y,&k);
47              Node ans;
48              ans=Map^k;
49              printf("%d\n",ans.m[x][y]);
50         }
51     }
52     return 0;
53 }
View Code

 

你可能感兴趣的:(How many ways??)