#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int n,ans;
int mapp[30][30],color[30];
bool Judge(int m,int r)//判断m是否与其相连接的点同色
{
for(int j=0;j<n;j++)
{
if(mapp[m][j]&&color[j]==r)
return false;
}
return true;
}
void DFS(int i,int usedcolor)
{
int j;
if(usedcolor>ans) return;//小小的剪枝
if(i>n)
{
ans=usedcolor;
return;
}
else{
for(j=1;j<=usedcolor;j++)//如果usedcolor就可以满足条件
{
if(Judge(i,j))
{
color[i]=j;
DFS(i+1,usedcolor);
color[i]=0;//回溯
}
}
if(j>usedcolor)//如果usedcolor种颜色不满足条件,就再增加一种
{
usedcolor++;
color[i]=usedcolor;
DFS(i+1,usedcolor);
color[i]=0;
}
}
}
int main()
{
int i,e;
char s[30];
while(scanf("%d",&n)&&n)
{
memset(mapp,0,sizeof(mapp));
memset(color,0,sizeof(color));
for(i=0;i<n;i++)
{
scanf("%s",s);
for(e=2;e<strlen(s);e++)
mapp[i][s[e]-'A']=1;
}
ans=100;
DFS(0,0);
if(ans==1) printf("1 channel needed.\n");
else printf("%d channels needed.\n",ans);
}
return 0;
}
poj1129
最新推荐文章于 2018-10-28 19:41:08 发布