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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章