原题地址http://acm.jlu.edu.cn/joj/showproblem.php?pid=1003
这是一个有关图的m着色的问题,应用到了回溯算法。
#include <stdio.h>
#include <memory.h>
#define N 26
int a[N+1][N+1];//邻接矩阵
int x[N+1]; //各个顶点的图色
int flag;//是否符合要求
int m;//颜色的数量
int n;//顶点的实际个数
//判断是否可行
int ok(int t)
{
int i;
for(i=1; i<=N;i++)
if(a[t][i] && x[t]==x[i])
return 0;
return 1;
}
//回溯算法
void dfs(int t)
{
int i;
if(t>n)
flag = 1;
else
for(i=1; i<=m; i++)
{
x[t] = i;
if(ok(t))
dfs(t+1);
x[t] = 0;
}
}
int main(int argc, char *argv[])
{
int i,j;
char s[N+2];
while(scanf("%d",&n),n)
{
//getchar();
memset(a,0,sizeof(a));
for(i=1; i<=n; i++)
{
scanf("%s",s);
for(j=2;s[j]!='/0';j++)
{
a[i][s[j]-'A'+1] = 1;
//a[s[j]-'A'+1][i] = 1;
}
}
for(m=1; m<=4; m++)
{
memset(x,0,sizeof(x));
flag = 0;
dfs(1);
if(flag == 1)
break;
}
if(m == 1)
printf("1 channel needed./n");
else
printf("%d channels needed./n",m);
}
return 0;
}