How many ways??

 

 

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

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<memory>
 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<n;i++)
18          for(int j=0;j<n;j++)
19           for(int k=0;k<n;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;i<n;i++) d.m[i][i]=1;
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<m;i++){
41             scanf("%d%d",&x,&y);
42             Map.m[x][y]=1;
43         }
44         scanf("%d",&q);
45         for(i=0;i<q;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

猜你喜欢

转载自www.cnblogs.com/li-jia-hao/p/12912109.html