题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2254
题意:有向图中求A点到B点路径长度为t1~t2的路径总数
离散数学中,有向图的邻接矩阵A表示所有点之间路径长度为1的路径数量,A^n则表示路径长度为n的路径数量,故需要求某两点在(A^t1)~(A^t2)的路径数量之和

1 #include<iostream> 2 #include<map> 3 #include<cstring> 4 const int N=31; 5 const int m=2008; 6 using namespace std; 7 int n,len; 8 struct Matrix{ 9 int map[N][N]; 10 }; 11 12 Matrix mat[10001]; 13 map<int,int>mp; 14 15 Matrix Mul(Matrix &a,Matrix &b){ 16 Matrix c; 17 for(int i=0;i<len;i++){ 18 for(int j=0;j<len;j++){ 19 c.map[i][j]=0; 20 for(int k=0;k<len;k++){ 21 c.map[i][j]+=a.map[i][k]*b.map[k][j]; 22 c.map[i][j]%=m; 23 } 24 } 25 } 26 return c; 27 } 28 /* 29 Matrix Pow(int n){ 30 if(n==1)return mat[0]; 31 else if(n&1){ 32 return Mul(mat[0],Pow(n-1)); 33 }else { 34 Matrix temp=Pow(n>>1); 35 return Mul(temp,temp); 36 } 37 } 38 */ 39 40 int main(){ 41 while(scanf("%d",&n)!=EOF){ 42 memset(mat[0].map,0,sizeof(mat[0].map)); 43 mp.clear(); 44 int p1,p2,k; 45 len=0; 46 while(n--){ 47 scanf("%d%d",&p1,&p2); 48 if(mp.find(p1)==mp.end()){ 49 mp[p1]=len++; 50 } 51 if(mp.find(p2)==mp.end()){ 52 mp[p2]=len++; 53 } 54 mat[0].map[mp[p1]][mp[p2]]++; 55 } 56 for(int i=1;i<10001;i++){ 57 mat[i]=Mul(mat[i-1],mat[0]); 58 } 59 scanf("%d",&k); 60 int v1,v2,t1,t2; 61 while(k--){ 62 scanf("%d%d%d%d",&v1,&v2,&t1,&t2); 63 if(mp.find(v1)==mp.end()||mp.find(v2)==mp.end()){ 64 printf("0\n"); 65 continue; 66 } 67 int ans=0; 68 for(int i=t1-1;i<t2;i++){ 69 ans+=mat[i].map[mp[v1]][mp[v2]]; 70 } 71 printf("%d\n",ans%m); 72 } 73 } 74 return 0; 75 }