HDU 2157 How many ways??

题目地址:点击打开链接

思路:矩阵快速幂+有向可达图,仔细推敲一下,就能明白,矩阵乘以几次,就是经过几个点,而且里面包含了走重复边的可能

AC代码:

#include <iostream>
#include <cstring>

using namespace std;

int per[21][21],s[21][21],middle[21][21],n;

void matrix_mul(int a[21][21],int b[21][21])//数组就是在原地址上进行操作
{
    int i,j,k,c[21][21] = {0};
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            for(k=0; k<n; k++)
            {
                c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % 1000;//仔细观察坐标,挺好记的
            }
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            a[i][j] = c[i][j];
        }
    }
}

int matrix_result(int a,int b,int k)
{
    int i,j;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            per[i][j] = (i == j);//初始化为单位矩阵
        }
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            middle[i][j] = s[i][j];
        }
    }
    while(k)
    {
        if(k & 1)
            matrix_mul(per,middle);
        matrix_mul(middle,middle);
        k >>= 1;
    }
    return per[a][b];
}
int main()
{
    int m,t,x,y,k,i;
    while(cin>>n>>m,m+n)
    {
        memset(s,0,sizeof(s));
        for(i=0; i<m; i++)
        {
            cin>>x>>y;
            s[x][y] = 1;
        }
        cin>>t;
        while(t--)
        {
            cin>>x>>y>>k;
            cout<<matrix_result(x,y,k)<<endl;
        }
    }
}

大神地址: 点击打开链接

你可能感兴趣的:(HDU 2157 How many ways??)