暴力建图bfs0分求条
查看原帖
暴力建图bfs0分求条
982518
sjwhsss楼主2024/11/4 21:32

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;
}
2024/11/4 21:32
加载中...