是道模板题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define N 210
using namespace std;
struct Mat
{
double mat[N][N];
};
double num[N];
Mat a;
int n;
void init()
{
int q, u, v;
double x;
for(int i = 0; i < n; i ++)
scanf("%lf", &num[i]);
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
a.mat[i][j] = (i == j);
for(int i = 0; i < n; i ++)
{
scanf("%d", &q);
int temp = q;
while(q--)
{
scanf("%d", &u);
a.mat[i][u-1] += 1.0 / temp;
a.mat[i][i] -= 1.0 / temp;
}
}
}
Mat operator * (Mat a, Mat b)
{
Mat c;
memset(c.mat, 0, sizeof(c.mat));
for(int k = 0; k < n; k ++)
for(int i = 0; i < n; i ++)
{
if(a.mat[i][k] <= 0) continue;
for(int j = 0; j < n; j ++)
{
if(b.mat[k][j] <= 0) continue;
c.mat[i][j] += a.mat[i][k] * b.mat[k][j];
}
}
return c;
}
Mat poww(Mat a, int b)
{
Mat c;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j++)
c.mat[i][j] = (i == j);
Mat base = a;
while( b != 0 )
{
if( b & 1 )
c = c * base;
base = base * base;
b >>= 1;
}
return c;
}
int main()
{
int m;
double res;
int cas;
scanf("%d", &cas);
while(cas--)
{
scanf("%d", &n);
res = 0;
init();
scanf("%d", &m);
a = poww(a, m);
for(int i = 0; i < n; i++)
{
res = 0;
for(int j = 0; j< n; j++)
res += num[j]*a.mat[j][i];
printf("%.2lf", res);
if(i!=n-1) printf(" ");
}
printf("\n");
}
return 0;
}