zoukankan      html  css  js  c++  java
  • hdu 2157 How many ways?? (可达矩阵)

    题意:给你一个有向图,从A 点到 B点恰好经过k个点的方案数 (k < 20), 可以走重复边

    思路:利用离散数学中的可达矩阵,可达矩阵的K次幂便是从i到j走K步能到达的方案数

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    
    using namespace std;
    
    typedef long long ll;
    int N,M,P;
    const int MOD=1000;
    //int MOD;
    struct  Matrix
    {
        ll m[25][25];
    };
    
    Matrix A;
    Matrix I;
    
    Matrix multi(Matrix a,Matrix b)
    {
        Matrix ans;
        for(int i=0;i<N;i++)
        {
           for(int j=0;j<M;j++)
           {
              ans.m[i][j]=0;
              for(int k=0;k<P;k++)
              {
                 ans.m[i][j]+=a.m[i][k]*b.m[k][j]%MOD;
              }
              ans.m[i][j]%=MOD;
           }
        }
        return ans;
    }
    
    Matrix power(Matrix a,int k)
    {
        Matrix ans=I,p=a;
        while(k)
        {
          if(k&1)
          {
            ans=multi(ans,p);
          }
          k>>=1;
          p=multi(p,p);
        }
        return ans;
    }
    
    int main(int argc, char const *argv[])
    {
        int m;
        while(cin>>N>>m)
        {
           if(N==0&&m==0) break;
           M=P=N;
           memset(A.m,0,sizeof(A.m));
           while(m--)
           {
              int a,b;
              scanf("%d %d",&a,&b);
              A.m[a][b]=1;
           }
           for(int i=0;i<N;i++)
           I.m[i][i]=1;
           int T;
           cin>>T;
           while(T--)
           {
               int st,ed,k;
               scanf("%d %d %d",&st,&ed,&k);
               Matrix ans = power(A,k);
               printf("%lld
    ",ans.m[st][ed]);
           }
        }
           return 0;
    }
  • 相关阅读:
    ngTemplate
    HTML5
    angular指令
    todo
    调试语句
    route attribute in webapi
    ngModelController
    angularjs中的事件
    删除IE input 下的小叉叉
    《python网络数据采集》读后感 第八章:自然语言处理
  • 原文地址:https://www.cnblogs.com/simplekinght/p/6662224.html
Copyright © 2011-2022 走看看