1 #include<stdio.h> 2 #include<string.h> 3 int n,m,min,father[15],map[15][15]; 4 int find(int i) 5 { 6 if (father[i]!=i) return(find(father[i])); 7 return(father[i]); 8 } 9 void dfs(int now,int need) 10 { 11 int i,j,judge; 12 if (need>=min) return; 13 if (now==n) 14 { 15 if (need<min) min=need; 16 return; 17 } 18 for (i=0;i<now;i++) 19 { 20 judge=1; 21 for (j=0;j<now;j++) 22 if (find(j)==find(i)&&map[now][j]==0) judge=0; 23 if (judge==1){ 24 father[now]=find(i); 25 dfs(now+1,need); 26 } 27 } 28 father[now]=now; 29 dfs(now+1,need+1); 30 return; 31 } 32 int main() 33 { 34 int i,j,k; 35 while (~scanf("%d%d",&n,&m)) 36 { 37 memset(map,0,sizeof(map)); 38 for (i=0;i<n;i++) 39 { 40 father[i]=i; 41 scanf("%d",&k); 42 while (k--) 43 { 44 scanf("%d",&j); 45 map[i][j]=map[j][i]=1; 46 } 47 } 48 min=m+1; 49 dfs(1,1); 50 if (min<=m) printf("%YES\n"); 51 else printf("NO\n"); 52 } 53 return 0; 54 }
http://acm.hdu.edu.cn/showproblem.php?pid=2208