HDU 5305 Friends

来源:互联网 发布:茶 知乎 编辑:程序博客网 时间:2024/05/20 11:35

水水的DFS

题意:n个人m个关系,要求每个人的网上朋友和现实朋友一样多,求一共有多少种关系

解:因为数据小,暴力DFS就可以了,不过要一点小剪枝

#include <stdio.h>#include <string.h>int point[10];struct aaa{    int x,y;}line[30];struct bbb{    int online,outline;}node[10];int sum;void dfs(int n,int m,int p){    if(p>m)    {        int flag=0;        for(int i=1;i<=n;i++)        {            if(node[i].online!=node[i].outline||node[i].online!=point[i])            {                flag=1;                break;            }        }        if(flag==0)            sum++;        return ;    }    int t=line[p].x,tt=line[p].y;    for(int i=1;i<=2;i++)    {        if(i==1)        {            node[t].online++;            node[tt].online++;            if(node[t].online>point[t]||node[tt].online>point[tt])            {                node[t].online--;                node[tt].online--;                continue;            }        }        if(i==2)        {            node[t].outline++;            node[tt].outline++;            if(node[t].outline>point[t]||node[tt].outline>point[tt])            {                node[t].outline--;                node[tt].outline--;                continue;            }        }        dfs(n,m,p+1);        if(i==1)        {            node[t].online--;            node[tt].online--;        }        else        {            node[t].outline--;            node[tt].outline--;        }    }    return ;}int main(){    int t,n,m;    int x,y;    while(scanf("%d",&t)!=-1)    {        while(t--)        {            memset(point,0,sizeof(point));            memset(line,0,sizeof(line));            memset(node,0,sizeof(node));            int flag=1;            sum=0;            scanf("%d%d",&n,&m);            for(int i=1;i<=m;i++)            {                scanf("%d%d",&line[i].x,&line[i].y);                point[line[i].x]++;                point[line[i].y]++;            }            if(n==m&&n%2!=0)         //剪枝            {                printf("0\n");                continue;            }            for(int i=1;i<=n;i++)      //剪枝            {                if(point[i]%2!=0)                {                    printf("0\n");                    flag=0;                    break;                }                point[i]/=2;            }            if(!flag)                continue;            dfs(n,m,1);            printf("%d\n",sum);        }    }    return 0;}


0 0