poj 1129 搜索

//问题描述,这是一道典型的涂色问题,根据四色定理,最多不会超过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 搜索)