和上一题是一样的,本渣不能只参考百度,也得有自己的想法,把原先的深搜优化了一下,写的和位运算差不多,毕竟位运算我还是刚接触。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
bool state[40];
bool fuzhu[40][40];
int ans;
void dfs(int k,int i,bool x[])
{
if(ans<k) ans=k;
for(;i<=36;i++)
{
int count=0;
bool z[40];
memset(z,0,sizeof(z));
if(state[i])
{
for(int j=1;j<=36;j++)
{
if(fuzhu[i][j]&&x[j])
{
z[j]=true;
}
}
for(int j=1;j<=36;j++) if(z[j]) count++;
if(count>k) dfs(k+1,i+1,z);
}
}
}
int main()
{
int t,n,a,b;
bool y[40];
scanf("%d",&t);
while(t--)
{
memset(state,0,sizeof(state));
memset(fuzhu,0,sizeof(fuzhu));
memset(y,1,sizeof(y));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&a,&b);
fuzhu[a][b]=true;
state[a]=true;
}
ans=0;
dfs(0,1,y);
printf("%d\n",ans);
}
return 0;
}