#include #include #include using namespace std; const int MAXN = 1000 + 10; const int MAXH = 25; const int MAXA = 11; const int INF = 1000000000; vector adj[MAXN]; int dp[MAXN][MAXH][MAXH], F[1 << MAXA][MAXH][MAXH]; int h, t[MAXN], n; void dfs (int k) { int kA = 0; for(int i = 0; i < adj[k].size(); i++) { int to = adj[k][i]; dfs(to); ++kA; } for(int mask = 0; mask < (1 << kA); mask++) for(int i = 0; i <= h; i++) for(int j = 0; j <= h; j++) F[mask][i][j] = INF; for(int i = 0; i <= h; i++) { if (t[k] <= i) { F[0][i][i - t[k]] = 0; } else { F[0][i][h - t[k]] = 1; } } for(int mask = 0; mask < (1 << kA); mask++) for(int i = 0; i <= h; i++) for(int j = 0; j <= h; j++) if (F[mask][i][j] < INF) { for(int nB = 0; nB < kA; nB++) if ((mask & (1 << nB)) == 0) { for(int eT = 0; eT <= h; eT++) { F[mask + (1 << nB)][i][eT] = min(F[mask + (1 << nB)][i][eT], F[mask][i][j] + dp[adj[k][nB]][j][eT] + (j == h)); } } } for(int i = 0; i <= h; i++) for(int j = 0; j <= h; j++) dp[k][i][j] = F[(1 << kA) - 1][i][j]; } int main(int argc, const char * argv[]) { int testCases; cin >> testCases; while (testCases--) { cin >> n >> h; for(int i = 1; i <= n; i++) { cin >> t[i]; adj[i].clear(); } for(int i = 1; i <= n; i++) { int pow_i; cin >> pow_i; for(int j = 0; j < pow_i; j++) { int x; cin >> x; adj[i].push_back(x); } } dfs(1); int answer = INF; for(int j = 0; j <= h; j++) { answer = min(answer, dp[1][h][j] + 1); } cout << answer << endl; } return 0; }