//问题描述,这是一道典型的涂色问题,根据四色定理,最多不会超过4中颜色,所以只需要
//枚举1-3种颜色就行了
//对每一个节点来说,用k=1-cor颜色开始涂色,判断每种颜色是否可以使用,如果可以使用的话,
//则图成该种颜色,改图下一个节点
//11052306 c00h00g 1129 Accepted 180K 0MS C++ 1731B 2012-11-26 15:17:06
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int mat[27][27];
int n;
char ch[28];
//表示节点的颜色
int color[27];
//使用cor种颜色涂色 1<=cor<=4
//num表示节点的个数,cor表示有多少种颜色
bool paint(int num,int cor){
//对于每一个节点
for(int i=0;i<num;i++){
//对每一种颜色来说
for(int k=1;k<=cor;k++){
//判断当前颜色是否使用
bool flag=false;
for(int j=0;j<num;j++){
if(mat[i][j]==1){
if(color[j]==k){
flag=true;
break;
}
}
}
if(!flag){
color[i]=k;
//图上颜色后应该跳出,进行下一个节点的涂色,错误的原因
break;
}
if(flag&&k==cor)
return false;
}
}
return true;
}
int main(){
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
getchar();//读取最后一个回车,这一点也应该注意
memset(mat,0,sizeof(mat));
for(int i=0;i<n;i++){
gets(ch);
int len=strlen(ch);
if(len>2){
for(int j=2;j<len;j++){
mat[i][ch[j]-'A']=1;
}
}
}
//============================处理
bool output=false;
for(int i=1;i<=3;i++){
memset(color,0,sizeof(color));
if(paint(n,i)){
output=true;
if(i==1)
printf("1 channel needed.\n");
else
printf("%d channels needed.\n",i);
break;
}
}
if(output==false)
printf("4 channels needed.\n");
}
return 0;
}
poj 1129 搜索
最新推荐文章于 2019-08-02 17:00:22 发布