HDU 2157 - How many ways??

给图,图中任意可达的两点间步数为1

问从图中A点走到B点步数为k的有几条路

 

祭出离散数学图论那章中的 邻接矩阵A.

设S=Ak

则 S[a][b] 为 a到b,步数为k的不同路的条数

剩下的就是矩阵快速幂了

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int mod=1000; 
 6 struct P{
 7     int a[20][20];
 8 };    
 9 int n,m,t,a,b,k;
10 P s,c;
11 P mult(P a,P b)
12 {
13     P c;
14     memset(c.a,0,sizeof(c.a));
15     for(int i=0;i<n;i++)
16     {
17         for(int j=0;j<n;j++)
18         {
19             for(int k=0;k<n;k++)
20                 c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j] )%mod;
21         }
22     }
23     return c;
24 }
25 void fuc(int p,P s)
26 {
27     memset(c.a,0,sizeof(c.a));
28     for(int i=0;i<n;i++) c.a[i][i]=1;
29     while(p)
30     {
31         if(p&1)
32         {
33             c=mult(c,s);
34         }
35         s=mult(s,s);
36         p>>=1;
37     }
38 }
39 int main()
40 {
41     while(~scanf("%d%d",&n,&m)&&(m+n))
42     {
43         memset(s.a,0,sizeof(s.a));
44         for(int i=1;i<=m;i++)
45         {
46             scanf("%d%d",&a,&b);
47             s.a[a][b]=1;
48         }
49         scanf("%d",&t);
50         for(int i=1;i<=t;i++)
51         {
52             scanf("%d%d%d",&a,&b,&k);
53             fuc(k,s);
54             printf("%d\n",c.a[a][b]);
55         }
56     }
57 }

 

posted @ 2016-07-06 11:04  nicetomeetu  阅读(147)  评论(0编辑  收藏  举报