【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset

题目链接
【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset
【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset


【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset
【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset
【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset

#include<cstdio>
#include<bitset>
using namespace std;
const int N=110;
int n,m,q;
bitset<N>f[N][31];
int main()
{
	//freopen("in.txt","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1,u,v;i<=m;i++)
	    scanf("%d%d",&u,&v),f[u][0][v]=1;
	for(int i=0;i<30;i++)
	    for(int j=1;j<=n;j++)
	        for(int k=1;k<=n;k++)
	            if(f[j][i][k])f[j][i+1]|=f[k][i];
	scanf("%d",&q);
	while(q--)
	{
		int l,u,v;scanf("%d%d%d",&l,&u,&v);
		bitset<N>ans;ans[u]=1;
		for(int i=0;i<31;i++)
		    if(l&(1<<i))
		    {
		    	bitset<N>tmp;
				for(int j=1;j<=n;j++)
		    	    if(ans[j])tmp|=f[j][i];
		    	ans=tmp;
			}
		if(ans[v])puts("YES");
		else puts("NO");
	}
	return 0;
}

总结

DP判断可行性,倍增优化好题