#include <iostream>
using namespace std;
int map[27][27];
int n;
int ans[27];//记录每个点的着色的情况
int ok(int s)
{
for(int i = 0; i < n; i++)//判断是否有相连的并且与该点的颜色相等的
{
if(map[i][s]==1 && ans[i]==ans[s])
return 0;
}
return 1;
}
int dfs(int i,int m)//参数:开始的位置,颜色的多少
{
if(i == n) //该部分是指所有的点都已经着色成功了
return n ;
for(ans[i] = 1;ans[i]<=m ; ans[i]++)//已经假定了m种颜色
{
if(!ok(i)) //若该点着色的是这个颜色 就继续下面的 否则对下面的点进行着色。
continue;
else
return dfs(i+1,m); //对下一个点进行着色。
}
return 0;
}
int main()
{
int i,j;
char str[35];
int ls;
while(scanf("%d",&n),n)
{
getchar();//去掉回车键
memset(map,0,sizeof(map));
for(i = 0 ;i < n ; i++)//数据输入变成图保存
{
gets(str);
ls = strlen(str);
for(j = 2 ; j < ls ; j++)
map[i][str[j]-'A'] = 1;
}
memset(ans,0,sizeof(ans));
for(i = 1; i <= 4 ; i++)//四色定理,枚举使用的颜色
{
if(dfs(0,i))
break;
}
if(i>1)
printf("%d channels needed.\n",i);
else
printf("1 channel needed.\n");
}
system("pause");
return 0;
}
poj 1129 四色定理
最新推荐文章于 2021-12-10 15:36:49 发布