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 }
我自倾杯,君且随意