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