
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6
7 bool map[33][33];
8 int mark[33];
9 char str[33];
10 int n,ans;
11
12 bool Judge(int x,int color)
13 {
14 for(int i=0;i<n;i++){
15 if(i!=x&&map[x][i]&&mark[i]==color)
16 return 0;
17 }
18 return 1;
19 }
20
21 void dfs(int pos)
22 {
23 if(pos==n){
24 ans=min(ans,*max_element(mark,mark+n));
25 return ;
26 }
27 for(int i=pos;i<n;i++){
28 for(int j=1;j<=4;j++){
29 if(Judge(i,j)){
30 mark[i]=j;
31 dfs(i+1);
32 }
33 }
34 }
35 }
36
37
38 int main()
39 {
40 while(~scanf("%d",&n)&&n){
41 memset(map,false,sizeof(map));
42 for(int i=0;i<n;i++){
43 scanf("%s",str);
44 for(int j=2;j<strlen(str);j++){
45 map[i][str[j]-'A']=true;
46 map[str[j]-'A'][i]=true;
47 }
48 }
49 memset(mark,0,sizeof(mark));
50 ans=4;
51 mark[0]=1;
52 dfs(1);
53 if(ans==1){
54 printf("1 channel needed.\n");
55 }else
56 printf("%d channels needed.\n",ans);
57 }
58 return 0;
59 }
View Code