思路:
用一个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; }