poj 1129 四色定理
来源:互联网 发布:淘宝技巧 知乎 编辑:程序博客网 时间:2024/05/13 17:56
#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; }