Problem Description
北京迎来了第一个奥运会,我们的欢呼声响彻中国大地,所以今年的奥运金牌 day day up! 比尔盖兹坐上鸟巢里,手里摇着小纸扇,看的不亦乐乎,被俺们健儿的顽强拼搏的精神深深的感动了。反正我的钱也多的没地方放了,他对自己说,我自己也来举办一个奥运会,看谁的更火。不过他的奥运会很特别: 1 参加人员必须是中国人; 2 至少会加法运算(因为要计算本人获得的金牌数) 他知道中国有很多的名胜古迹,他知道自己在t1 到 t2天内不可能把所有的地方都玩遍,所以他决定指定两个地方v1,v2,如果参赛员能计算出在t1到t2天(包括t1,t2)内从v1到v2共有多少种走法(每条道路走需要花一天的时间,且不能在某个城市停留,且t1=0时的走法数为0),那么他就会获得相应数量的金牌,城市的总数<=30,两个城市间可以有多条道路 ,每条都视为是不同的。
Input
本题多个case,每个case: 输入一个数字n表示有n条道路 0<n<10000 接下来n行每行读入两个数字 p1,p2 表示城市p1到p2有道路,并不表示p2到p1有道路 (0<=p1,p2<2^32) 输入一个数字k表示有k个参赛人员 接下来k行,每行读入四个数据v1,v2,t1,t2 (0<=t1,t2<10000)
Output
对于每组数据中的每个参赛人员输出一个整数表示他获得的金牌数(mod 2008)
Sample Input
6 1 2 1 3 2 3 3 2 3 1 2 1 3 1 2 0 0 1 2 1 100 4 8 3 50
Sample Output
0 1506 0
题意:有向图中求A点到B点路径长度为t1~t2的路径总数
离散数学中,有向图的邻接矩阵A表示所有点之间路径长度为1的路径数量,A^n则表示路径长度为n的路径数量,故需要求某两点在(A^t1)~(A^t2)的路径数量之和
注意离散化的方法。用map来离散化。
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<math.h> 7 #include<algorithm> 8 #include<queue> 9 #include<set> 10 #include<bitset> 11 #include<map> 12 #include<vector> 13 #include<stdlib.h> 14 #include <stack> 15 using namespace std; 16 #define PI acos(-1.0) 17 #define max(a,b) (a) > (b) ? (a) : (b) 18 #define min(a,b) (a) < (b) ? (a) : (b) 19 #define ll long long 20 #define eps 1e-10 21 #define MOD 2008 22 #define N 36 23 #define inf 1e12 24 int n,q,tmp; 25 map<int,int>m; 26 struct Matrix { 27 int mp[N][N]; 28 }matrix[10006]; 29 Matrix Mul(Matrix a,Matrix b){ 30 Matrix res; 31 for(int i=0;i<tmp;i++){ 32 for(int j=0;j<tmp;j++){ 33 res.mp[i][j]=0; 34 for(int k=0;k<tmp;k++){ 35 res.mp[i][j]=(res.mp[i][j]+a.mp[i][k]*b.mp[k][j]%MOD+MOD)%MOD; 36 } 37 } 38 } 39 return res; 40 } 41 42 int main() 43 { 44 while(scanf("%d",&n)==1){ 45 m.clear(); 46 memset(matrix[0].mp,0,sizeof(matrix[0].mp)); 47 tmp=0; 48 for(int i=0;i<n;i++){ 49 int a,b; 50 scanf("%d%d",&a,&b); 51 if(m.find(a)==m.end()){ 52 m[a]=tmp++; 53 } 54 if(m.find(b)==m.end()){ 55 m[b]=tmp++; 56 } 57 matrix[0].mp[m[a]][m[b]]++; 58 } 59 for(int i=1;i<10006;i++){ 60 matrix[i]=Mul(matrix[0],matrix[i-1]); 61 } 62 scanf("%d",&q); 63 for(int i=0;i<q;i++){ 64 int v1,v2,t1,t2; 65 scanf("%d%d%d%d",&v1,&v2,&t1,&t2); 66 if(m.find(v1)==m.end() || m.find(v2)==m.end()){ 67 printf("0 "); 68 continue; 69 } 70 int ans=0; 71 for(int j=t1-1;j<t2;j++){ 72 if(j<0) continue; 73 ans+=matrix[j].mp[m[v1]][m[v2]]; 74 } 75 printf("%d ",ans%MOD); 76 } 77 } 78 return 0; 79 }