• hdu 2254 矩阵的应用


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2254

    题意:有向图中求A点到B点路径长度为t1~t2的路径总数

    离散数学中,有向图的邻接矩阵A表示所有点之间路径长度为1的路径数量,A^n则表示路径长度为n的路径数量,故需要求某两点在(A^t1)~(A^t2)的路径数量之和

    View Code
     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 }
  • 相关阅读:
    WPF复杂形状按钮
    (WPF)360安全卫士界面设计
    WPF图标拾取器
    WPF透明窗体制作
    空间分析开源库GEOS
    GIS开源程序收集
    flask 链接 url_for()
    自定制404错误页码
    Flask 模板语言
    flask路由和视图和cookie
  • 原文地址:https://www.cnblogs.com/wally/p/2939976.html
Copyright © 2020-2023  润新知