#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
#define LL long long
const double eps=1e-14;
int n;
struct matrix{
double f[22][22];
}c;
void mul(matrix &a,matrix b)//不能用matrix返回,是由于函数返回值太大??????
{
int i,j,k;
memset(c.f,0,sizeof(c.f));
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
if(a.f[i][k]<eps)continue;
for(j=0;j<n;j++)
{
if(b.f[k][j]<eps)continue;
c.f[i][j]+=a.f[i][k]*b.f[k][j];
}
}
}
a=c;
}
matrix pow_mod(matrix a,int b)
{
//cout<<1<<endl;
matrix s;
memset(s.f,0,sizeof(s.f));
for(int i=0;i<n;i++)
s.f[i][i]=1;
while(b)
{
if(b&1)
mul(s,a);
mul(a,a);
b=b>>1;
}
return s;
}
int main()
{
int m,T;
cin>>T;
while(T--)
{
cin>>n;
double a[22],p,s;
int i,j,k,x,y;
for(i=0;i<n;i++)
cin>>a[i];
matrix e;
memset(e.f,0,sizeof(e.f));
for(i=0;i<n;i++)
{
cin>>k;
if(k==0) // !!!!!一开始忘了,就一直错了
e.f[i][i]=1;
for(j=0;j<k;j++)
{
cin>>x;
e.f[i][x-1]=1.0/k;
}
}
cin>>m;
e=pow_mod(e,m);
double ans[22];
for(i=0;i<n;i++)
{
ans[i]=0;
for(j=0;j<n;j++)
ans[i]+=a[j]*e.f[j][i];
}
printf("%.2lf",ans[0]);
for(i=1;i<n;i++)
printf(" %.2lf",ans[i]);
printf("\n");
}
return 0;
}
/*
矩阵:
f[i][j]表示i倒水到j里的概率
*/
zoj 2974 Just Pour the Water 矩阵
最新推荐文章于 2019-03-18 20:48:45 发布