POJ1632 Vase collection (DFS)第二种方法,本渣自己想的

和上一题是一样的,本渣不能只参考百度,也得有自己的想法,把原先的深搜优化了一下,写的和位运算差不多,毕竟位运算我还是刚接触。
#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;
}

你可能感兴趣的:(ACM,poj)