rt,大样例没过
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int n , k , m , head[maxn] , cnt , qr[maxn] , qc[maxn] , r;
struct edge
{
int u , v , next , w;
}e[maxn];
bool vis[maxn][105];
void Insert(int u , int v , int w)
{
e[++cnt].u=u , e[cnt].v=v , e[cnt].next=head[u] , head[u]=cnt , e[cnt].w=w;
}
struct node
{
int u , rd , rc , rw; //点,轮 , 同序列的点走了多少个 , 序列号
};
void Bfs()
{
queue <node>q;
for (int i = head[1]; i; i = e[i].next)
{
q.push({e[i].v , 1 , 2 , e[i].w});
vis[e[i].v][1]=1;
}
while(q.size())
{
int u = q.front().u , rd = q.front().rd , rc = q.front().rc , rw = q.front().rw;q.pop();
for (int i = head[u]; i; i = e[i].next)
{
int v = e[i].v , w = e[i].w;
if (w != rw && rd + 1 <= r && !vis[v][rd + 1])
{
vis[v][rd + 1]=1;
q.push({v , rd + 1 , 1 , w});
}
else if (w == rw && rc + 1 <= k && !vis[v][rd])
{
vis[v][rd]=1;
q.push({v , rd , rc + 1 , w});
}
}
}
return;
}
void Solve()
{
memset(e , 0 , sizeof(e));
memset(head , 0 , sizeof(head));
memset(vis , 0 , sizeof(vis));
memset(qc , 0 , sizeof(qc));
memset(qr , 0 , sizeof(qr));
n = k = m = cnt = r = 0;
scanf("%d%d%d" , &n , &k , &m);
for (int i = 1; i <= n; i++)
{
int l;
scanf("%d" , &l);
int a , b;
scanf("%d" , &a);
for (int j = 2; j <= l; j++)
{
scanf("%d" , &b);
Insert(a , b , i);
a = b;
}
}
for (int i = 1; i <= m; i++)
{
scanf("%d%d" , &qr[i] , &qc[i]);
r = max(r , qr[i]);
}
Bfs();
for (int i = 1; i <= m; i++)
{
printf("%d\n" , vis[qc[i]][qr[i]] ? 1 : 0);
}
}
int main ()
{
// freopen("chain3.in" , "r" , stdin);
// freopen("chain.out" , "w" , stdout);
// freopen("in.txt" , "r" , stdin);
int t;
scanf("%d" , &t);
// return 0;
for (int i = 1; i <= t; i++)
{
Solve();
}
// fclose(stdin);
// fclose(stdout);
return 0;
}