码迷,mamicode.com
首页 > 其他好文 > 详细

How many ways??

时间:2020-05-18 18:29:43      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:png   clu   图片   alt   any   string   sizeof   cst   none   

技术图片

 

 技术图片

 

 技术图片

 

 

思路分析:其实我们在很久之前曾经做过一道类似的题,那道题要求我们求的是经过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

 

How many ways??

标签:png   clu   图片   alt   any   string   sizeof   cst   none   

原文地址:https://www.cnblogs.com/li-jia-hao/p/12912109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!