您的位置:首页 > 其它

HDU 5305 Friends

2015-07-26 10:11 351 查看
水水的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: