题意:
题目大概是说无线电可以覆盖的范围很大,我们可以通过中继器继续扩大范围,但是中继器的信号干扰也很强,同一频道用相邻的中继器会使信号相互干扰,大大降低他们的收听质量,所以同一频道的电台尽量使用不相邻的中继器
给出了每个中继器的相邻情况,问最少有几个频道用中继器不会产生干扰
把题意抽象出来,将中继器看作结点,相邻的两个中继器之间连一条边,用最少的颜色给相邻的结点涂上不一样的颜色
这就牵扯四色定理了,四色定理是这样说的:
任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。所以我们可以确定答案一定不超过4,这样就可以直接定义四种颜色为1 、2、3、 4去染色,一旦两个结点之前存在边并且和上一个结点颜色不一样就标记一下,如果颜色相同就给当前结点染上不一样的颜色,去递归下一个结点
int mapp[26][26],ans[26];
char s[28];
int n;
void dfs(int k){
int flag;
if(k == n) return ; // 所有点都已经跑完 退出循环
for(int i=1;i<=4;i++){ // 基于四色定理
flag = 0;
for(int j=0;j<n;j++){
// 两点之间存在边并且这个结点与上一个结点颜色不同
if(mapp[k][j] && ans[j] == i){
flag = 1;
break;
}
}
if(flag == 0){
// 说明新的结点与上一个结点颜色相同
ans[k] = i;
dfs(k+1);
break;
}
}
}
int main(){
while(~scanf("%d",&n) && n != 0){
memset(mapp,0,sizeof mapp);
memset(ans,0,sizeof ans);
for(int i=0;i<n;i++){
scanf("%s",s);
for(int j=2;s[j];j++){ // 将相邻的点存为1
mapp[i][s[j]-'A'] = 1;
mapp[s[j]-'A'][i] = 1;
}
}
dfs(0); // 从第一个点开始
sort(ans,ans+26);
if(ans[25] == 1){
printf("%d channel needed.\n",ans[25]);
}else{
printf("%d channels needed.\n",ans[25]);
}
}
return 0;
}