HDu 6321 Dynamic Graph Matching(状態圧縮)

4759 ワード

http://acm.hdu.edu.cn/showproblem.php?pid=6321
1つの図にN個の点といくつかの質問があり、1個の質問ごとに1つの辺を増やしたり削除したりして、1個の質問出力ごとに1~N/2個の交差しない辺を選択する案数.
考え方:n=10のため,状態圧縮でこの問題を処理することができ,この辺を加えると,この辺の2つの端点のバイナリ位置はいずれも1として表される.
1つのエッジaを加えるたびに、bは、あるiのバイナリa−とb−の対応する位置が1である場合、すなわち、この状態はi−(1<
#include
using namespace std;
const int mod=1e9+7;
#define ll long long
ll dp[1111];
int cnt[1111];
ll ans[11];
void init()
{
    memset(cnt,0,sizeof(cnt));
    for(int i=1;i<=1023;i++)
    {
        int x=i;
        int f=0;
        while(x)
        {
            if(x&1)f++;
            x>>=1;
        }

        cnt[i]=f;
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    char c[5];
    int x,y;
    init();
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        memset(dp,0,sizeof(dp));
        memset(ans,0,sizeof(ans));
        dp[0]=1;
        while(m--)
        {
            scanf("%s%d%d",&c,&x,&y);
            x--,y--;
            if(c[0]=='+')
            {
                for(int i=(1<1<1<if(i&(1<1<2==0)
                    {
                        dp[i]=(dp[i]+dp[i-(1<1<1<1<else
            {
                for(int i=(1<1<1<if(i&(1<1<2==0)
                    {
                        dp[i]=(dp[i]-dp[i-(1<1<1<1<for(int i=2;i<=n;i+=2)
            {
                if(i>2)printf(" ");
                printf("%lld",ans[i]);
            }
            printf("
"
); } } return 0; }