典型的图着色问题,相邻的顶点不能着相同的颜色。求最少的着色数。贪心法求解。每次都从颜色编号1开始着色,若相邻的顶点中存在该颜色,则增加颜色为编号2,若相邻的顶点中仍存在该颜色,则增加颜色为3,一直循环。下面给出代码(代码中注释部分要注意):
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#define Max 30
using namespace std;
bool trim[Max][Max];
int record[Max];
int help[Max];
int n;
void Set_record(int number){
int pivot=0;
for(int i=1;i<=n;i++) // 将所有相邻的结点的颜色编号记录在help数组中
if(trim[i][number])
help[pivot++]=record[i];
sort(help,help+pivot); // 排序,便于比较
record[number]=1; // 初始为颜色 1
for(int i=0;i<pivot;i++) // 贪心算法
if(help[i]==record[number])
record[number]++;
}
int main(){
char temp;
while(scanf("%d",&n),n){
memset(trim,0,sizeof(trim));
memset(record,0,sizeof(record)); // 初始为颜色编号0(无效编号)
for(int i=1;i<=n;i++){
getchar();
getchar();
while(true){
temp=getchar();
if(temp=='\n')
break;
trim[i][temp-'A'+1]=true;
}
}
for(int i=1;i<=n;i++)
Set_record(i);
sort(record+1,record+1+n);
int Count=1;
for(int i=1;i<n;i++) // 求出不同颜色个数
if(record[i+1]>record[i])
Count++;
if(Count==1) // 注意单复数channel
printf("1 channel needed.\n");
else
printf("%d channels needed.\n",Count);
}
return 0;
}