poj 1129 Channel Allocation

//参考 poj9 1620 Phone Home

#include
<iostream> //求图的色数,即使各相邻顶点的颜色不相同所需的最小色数.数据量小,直接枚举+DFS
#include<stdio.h>
#include
<cstring>
using namespace std;
int n,cnt[30][30],color[30],num,suc;
void dfs(int i)
{
for(int c=1;c<=num;++c)
{
int flag=1;
for(int j=0;j<n;++j)
if(cnt[i][j]==1&&color[j]==c)
{
flag
=0;
break;
}
if(flag==1)
{
color[i]
=c;
if(i==n-1)
{
suc
=1;
break;
}
dfs(i
+1);
if(suc==1)
break;
color[i]
=0;
}
}
}
int main()
{
char ch[50];
while(cin>>n&&n)
{
memset(cnt,
0,sizeof(cnt));
for(int i=0;i<n;++i)
{
cin
>>ch;
for(int j=2;j<strlen(ch);++j)
cnt[i][ch[j]
-'A']=1;
}
memset(color,
0,sizeof(color));
suc
=0;
for(num=1;num<=4;++num) //枚举色数, 根据四色定理,色数最大为4
{
dfs(
0);
if(suc==1)
{
if(num>1)
printf(
"%d channels needed.\n",num);
else
printf(
"1 channel needed.\n");
break;
}
}
}
return 0;
}

  

posted on 2011-07-22 22:20  sysu_mjc  阅读(184)  评论(0编辑  收藏  举报

导航