题意:n,表示有n个节点(A~Z)的无向图,后面有n行,每行有一个字母,表示该节点,再后面有一个字符串,表示与该节点连接的节点。给每个节点染色,要求每两个连接的节点染得颜色不一样。问最少需要多少种颜色?
思路:经典的燃色问题,而且数据范围较小,直接可以暴力即可。我们给每种颜色编号,用矩阵存储无向图,然后从1开始枚举枚举颜色个数。再使用 dfs暴力搜索,即可得到结果。
代码:
#include <stdio.h>
#include <algorithm>
using namespace std;
#include <string.h>
int map[100][100];
int book[100];
int flag=0,n;
int check(int data,int num)
{
for(int i=0;i<26;i++) //判断与data节点相联,且染过颜色恰好为num时
if((map[data][i]==1||map[i][data]==1)&&book[i]==num)
return 0; //不能在用此种颜色
return 1;
}
void dfs(int data,int total)
{
if(data>=n)
{
flag=1;
return ;
}
for(int i=1;i<=total;i++)
{
if(check(data,i)) //枚举每一种颜色,寻找符合条件的颜色
{
book[data]=i; //把这个节点标记成i颜色
dfs(data+1,total);
book[data]=0;
}
}
}
int main()
{
while(~scanf("%d",&n)&&n)
{
memset(map,0,sizeof(map));
memset(book,0,sizeof(book));
char st[100];
for(int i=0;i<n;i++)
{
scanf("%s",st);
for(int j=2;j<strlen(st);j++)
map[st[0]-'A'][st[j]-'A']=1;
}
flag=0;
for(int i=1;i<=n;i++)
{
dfs(0,i);
if(flag)
{
if(i==1)
printf("1 channel needed.\n");
else printf("%d channels needed. \n",i);
break;
}
}
}
return 0;
}