• hdu 2254 奥运(邻接矩阵应用)


    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 }
    View Code
  • 相关阅读:
    [Java]基础知识复习:例外的在继承中的机制
    2005年7月28日,终于结束了。
    从不知道到知道,从没有到有,是一个质的进步。
    正确的心态、积极的态度、坚定的信心、愉快的心情
    今天终于见到了她。
    textarea自增高(无滚动条)纯js实现
    带,号字符串转成表的函数操作
    MAK密钥集锦
    用户注册信息验证类库
    C#将文档(Word\ Excel\ PowerPoint\ Visio\ text\ XML\ RTF\ CSV )转成Pdf
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/5041535.html
Copyright © 2020-2023  润新知