HDU 5305--Friends(深搜)

题目网址

题意:相当于n个点,m条路,要给路赋值0或1,要求赋完后,每个点连接的路上,0,1的个数相同,求有几种赋值方式

思路:因为数据量太小,n《=8,所以直接暴力深搜就可以了,因为要求0,1个数相等,记得剪枝就可以了,不难

代码:

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int n,m,T,aa,bb,num[10],x[10],y[10],ans,p[10];
struct AA
{
    int l,r;
    int ok;
    bool operator<(const AA&aa)const{
        if(l==aa.l) return r<aa.r;
    return l<aa.l;
    }
}pos[50];
int dfs(int rt)
{
    int a,b;
    if(rt==m+1) {
            //cout<<"!!"<<endl;
        for(int i=1;i<=n;i++)
        {
            if(x[i]!=y[i]) return 0;
        }
            ans++;return 0;}
    a=pos[rt].l;
    b=pos[rt].r;
   // cout<<rt<<" "<<a<<" "<<b<<" "<<x[a]<<" "<<y[a]<<" "<<x[b]<<" "<<y[b]<<endl;
    if((x[a]==p[a]||x[b]==p[b])&&(y[a]<p[a]&&y[b]<p[b]))
    {
        y[a]++;y[b]++;dfs(rt+1);y[a]--;y[b]--;
    }
    else if((x[a]<p[a]&&x[b]<p[b])&&(y[a]==p[a]||y[b]==p[b]))
    {
        x[a]++;x[b]++;dfs(rt+1);x[b]--;x[a]--;
    }
    else if(x[a]<p[a]&&y[a]<p[a]&&x[b]<p[b]&&y[b]<p[b])
    {
        x[a]++;
        x[b]++;
        dfs(rt+1);
        x[a]--;
        x[b]--;
        y[a]++;
        y[b]++;
        dfs(rt+1);
        y[a]--;
        y[b]--;
    }
    return 0;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        ans=0;
       scanf("%d%d",&n,&m);
       memset(num,0,sizeof(num));
       memset(x,0,sizeof(x));
       for(int i=1;i<=m;i++)
       {
           scanf("%d%d",&aa,&bb);
           pos[i].l=min(aa,bb);
           pos[i].r=max(aa,bb);
           num[aa]++;
           num[bb]++;
       }
       for(int i=1;i<=n;i++)
       {
           if(num[i]%2)
           {
               ans=-1;break;
           }
           p[i]=num[i]/2;
       }
       if(ans==-1) printf("0\n");
       else
       {
         sort(pos+1,pos+1+m);
        dfs(1);
        printf("%d\n",ans);
       }

    }
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/81071204