- 题目要求相邻点采用不同电台波段,可以转化成染色问题,计算无向图的最少着色数,也即是求无向图的最大团规模。
- 可参见POJ 1419求最大团详细分析。
#include<cstdio>
#include<cstring>
#define maxN 27
int nodeNum;
char g[maxN][maxN];
char cliqueSet[maxN][maxN],cliqueSize[maxN];
int maxCliqueSize;
int DFS(char adjNum,char tmpCliqueSize)
{
if(adjNum == 0)
{
if(tmpCliqueSize > maxCliqueSize)
{
maxCliqueSize = tmpCliqueSize;
return 1;
}
return 0;
}
char i,j;
char newNode;
char nextAdjNum;
for(i = 0;i < adjNum;i++)
{
nextAdjNum = 0;
newNode = cliqueSet[tmpCliqueSize][i];
if(tmpCliqueSize+adjNum-i <= maxCliqueSize) return 0;
if(tmpCliqueSize+cliqueSize[newNode] <= maxCliqueSize) return 0;
for(j = i+1;j < adjNum;j++)
{
if(g[newNode][cliqueSet[tmpCliqueSize][j]])
cliqueSet[tmpCliqueSize+1][nextAdjNum++] = cliqueSet[tmpCliqueSize][j];
}
if(DFS(nextAdjNum,tmpCliqueSize+1)) return 1;
}
return 0;
}
int maxClique()
{
char i,j;
char adjNum;
maxCliqueSize = 0;
for(i = nodeNum-1;i >= 0;i--)
{
adjNum = 0;
for(j = i+1;j <= nodeNum-1;j++)
{
if(g[i][j])
cliqueSet[1][adjNum++] = j;
}
DFS(adjNum,1);
cliqueSize[i] = maxCliqueSize;
}
return 0;
}
int generateGraph(char* in)
{
int a = *(in)-'A';
while(*(++in))
g[a][*in-'A'] = 1;
return 0;
}
int main()
{
char strInput[30];
while(scanf("%d",&nodeNum)&&nodeNum)
{
memset(g,0,sizeof(g));
getchar();
for(int i = 0;i < nodeNum;i++)
{
gets(strInput);
generateGraph(strInput);
}
maxClique();
if(maxCliqueSize == 1)
printf("1 channel needed.\n");
else
printf("%d channels needed.\n",maxCliqueSize);
}
return 0;
}