HDU 2157 How many ways??

矩阵快速幂。

先构造邻接矩阵,这个矩阵的K次方,就表示从从i到j有几种走法。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int n,m;
const int maxn=20;
const int MOD=1000;
struct Matrix
{
    int A[25][25];
    Matrix operator*(Matrix b);
};

Matrix Matrix::operator*(Matrix b)
{
    Matrix c;
    memset(c.A,0,sizeof(c.A));
    int i,j,k;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            for(k=1; k<=n; k++)
                c.A[i][j]=(c.A[i][j]+(A[i][k]*b.A[k][j])%MOD)%MOD;
    return c;
}

int main()
{
    int i,j;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0&&m==0) break;
        Matrix JZ;
        Matrix CS;
        memset(JZ.A,0,sizeof(JZ.A));
        memset(CS.A,0,sizeof(CS.A));
        for(i=0; i<m; i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            u++;
            v++;
            CS.A[u][v]=1;
        }

        int T;
        scanf("%d",&T);

        while(T--)
        {
            int s,t,k;
            Matrix c;
            scanf("%d%d%d",&s,&t,&k);
            s++;
            t++;
            for(i=1; i<=n; i++)
                for(j=1; j<=n; j++)
                    JZ.A[i][j]=CS.A[i][j];
            for(i=1; i<=n; i++)
                for(j=1; j<=n; j++)
                {
                    if(i==j) c.A[i][j]=1;
                    else c.A[i][j]=0;
                }
            while(k>0)
            {
                if(k%2==1) c=c*JZ,k--;
                else JZ=JZ*JZ,k=k/2;
            }
            printf("%d\n",c.A[s][t]);
        }
    }
    return 0;
}

 

posted @ 2015-07-21 18:39  Fighting_Heart  阅读(146)  评论(0编辑  收藏  举报