Just Pour the Water ZOJ - 2974 矩阵快速幂

思路:

用一个N*N的矩阵的第一行来记录水量。

另外一个矩阵记录转移的方式,不是很好描述,具体看代码。

当k是0的时候,水量都给了自己。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
const int N = 25;
struct Matrix {
    double m[N][N];
    Matrix(){};
    Matrix operator*(Matrix const &a) const {
        Matrix res;
        memset( res.m,0,sizeof res.m ) ;
        for ( int i=0; i<n; i++ ) {
            for ( int j=0; j<n; j++ ) {
                for (int k=0;k<n;k++ ) {
                    res.m[i][j] += this->m[i][k]*a.m[k][j];
                }
            }
        }
        return res;
    }
};
Matrix res;
void pow_mod( Matrix base ,int n ) {

    while ( n>0 ) {
        if ( n&1 ) res = res*base;
        base = base*base;
        n>>=1;
    }
}
int main()
{
    int T;
    cin>>T;
    while ( T-- ) {
        scanf("%d",&n);
        memset( res.m,0,sizeof res.m );
        for ( int i=0; i<n; i++ )
            scanf("%lf",&res.m[0][i]);
        int k;
        Matrix base;
        memset( base.m,0,sizeof base.m );
        for ( int i=0; i<n; i++ ) {
            scanf("%d",&k);
            if ( k==0 ) {
                base.m[i][i] = 1;
                continue;
            }
            for ( int j=0; j<k; j++ ) {
                int num;
                scanf("%d",&num);
                base.m[i][num-1] = 1.0/k;
            }
        }
        int time;
        scanf("%d",&time);
        pow_mod( base,time ) ;
        for ( int i=0; i<n; i++ )
            if ( i==n-1 ) printf("%.2f\n",res.m[0][i]);
            else printf("%.2f ",res.m[0][i]);
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/Peppermint__/article/details/80043364