如题:http://poj.org/problem?id=1129
用中继器(repeater)给每个接受者(receiver)发送信号,为了防止信号干扰,两个相邻的广播站之间的中继器要不相同。问至少需要多少个中继器。
等同于个个图着色,问最少需要几种颜色使得相邻顶点颜色不同。
由四色原理:每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同。所以最多只需要4种颜色。(这里没用四色原理,用的直接搜素。)
用深搜来做DFS(int v,int colnum)//假设当前以v为顶点 图可以用从colnum数量的颜色涂满。然后只需要每深一层v++,最后如果v>n(n是图总顶点数),表示全部顶点涂色完毕,返回。
#include<iostream>
#include<cctype>
using namespace std;
#define N 27
int g[N][N],num,n,isfind=0;
int col[N];
int ok(int v)
{
for(int i=1;i<=n;i++)
{
if(i!=v)
{
if(g[v][i]&&col[v]==col[i])
return 0;
}
}
return 1;
}
void DFS(int v,int colnum)
{
if(v>n)
{
isfind=1;
return;
}
for(int i=1;i<=colnum;i++)
{
col[v]=i;
if(ok(v))
{
DFS(v+1,colnum);
}
}
if(!isfind)
{
num++;
DFS(v,colnum+1);
}
}
int main()
{
int i;
char ch;
while(scanf("%d", &n) && n)
{
memset(g, 0, sizeof(g));
ch = getchar(); //这个ch用来接收scanf多出的那个回车(缓冲区中)
for(i=1; i<=n; i++)
{
ch = getchar();
ch = getchar();
while(isalpha(ch = getchar()))
{
g[i][ch-'A'+1] = 1;
g[ch-'A'+1][i] = 1;
}
}
isfind=0;
num=1;
DFS(1,1);
if (num == 1)
printf ("1 channel needed.\n");
else printf ("%d channels needed.\n", num);
}
return 0;
}