JZOJsenior3541.【清华集训2014】破冰派对

来源:互联网 发布:上海淘宝运营助理招聘 编辑:程序博客网 时间:2024/05/16 17:41

problem

Description

由于计算机系的同学们都很宅,很多同学虽然身在一个系,但是入学很久还是相互不认识。学生会主席小Y希望举办一次破冰派对,要让同学们多从寝室里走出来参加娱乐活动,也要让尽量多不认识的同学们通过活动相互认识。自然的,如果参加活动的同学互相都不认识,那便是极好的。:)

要办一次成功的派对是很不容易的,不光需要有同学参加,优秀的工作人员也是必不可少的。他们需要为派对的筹办付出很多的努力,因此一个和谐的团队是非常重要的。小Y希望所有工作人员都是相互认识的。

计算机系一共有N个同学,所有同学从1到N编号。有M对同学相互认识,而其余的同学相互不认识。

小Y希望从中选出一些工作人员组成工作团队,让这个工作团队负责活动的组织,而其余的所有非工作人员,就自然都成为了活动的参与者。小Y要求:

1、工作团队的成员必须相互认识;

2、参与活动的同学必须相互不认识;

3、至少有一个同学参与活动,也至少有一个同学是工作人员。

小Y想知道,一共有多少种工作团队的选择方案呢?

Input

第一行读入一个整数T,表示测试数据的组数。接下来T组数据,每组数据格式如下:

第一行包含两个整数N和M。

接下来M行,第i行包含两个不同的,在1到N之间的整数xi,yi,表示编号为xi和yi的同学相互认识。

输入数据保证,在每一组测试数据中,任意两个同学之间的朋友关系都不会被列出两次。

Output

对于每一组测试数据输出一行一个整数,表示可行的方案总数,模1000003的余数。

Sample Input

2

1 0

4 4

1 2

1 3

2 3

3 4

Sample Output

0

3

Data Constraint

对于20%的数据满足N ≤ 10;

对于40%的数据满足N ≤ 30;

对于100%的数据满足1 ≤ N ≤ 1000,0 ≤ M ≤ N^2,1 ≤ T ≤ 6。

Hint

如果程序没有输出T行整数,直接得0分;

如果程序对于每一组测试数据均输出正确答案,则得10分;

如果程序输出并不完全正确,但是对于超过一半的测试数据输出正确答案,则得5分;

其余情况得0分。

注意:样例输出可以得到10分。


analysis

20%的数据

直接跑一个毫无优化O(2n)dfs 哦对了不要告诉我你连这都不会

40%的数据

给dfs加个剪枝:若当前同学与已选同学有不认识就不继续dfs,40分

100%的数据

再加一个剪枝:若当前同学与未选同学认识也不继续dfs,100分

愚蠢的OJ会卡成TLE90,强行开O2跑得飞快

code

#pragma GCC optimize(2)#include<cstdio>#include<cstring>using namespace std;int a[1001][1001];int p[1001];int n,m,t,ans;void dfs(int x,int y){    if(x>n)    {        if(y!=0 && y!=n)ans++;        return;    }    bool bz=1,bz1=1;    for(int j=1;j<x;j++)     {        if(p[j])        {            if(a[x][j]==0)bz=0;        }        else        {               if(a[x][j])bz1=0;        }    }    if(bz)     {        p[x]=1;        dfs(x+1,y+1);    }    if(bz1)    {        p[x]=0;        dfs(x+1,y);    }}int main(){    //freopen("readin.txt","r",stdin);    scanf("%d",&t);     while(t--)    {        memset(a,0,sizeof(a));        memset(p,0,sizeof(p));        scanf("%d%d",&n,&m);        for(int i=1;i<=m;i++)        {            int x,y;            scanf("%d%d",&x,&y);            a[x][y]=a[y][x]=1;        }           ans=0;        dfs(1,0);        printf("%d\n",ans);    }}