Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198248
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-08-05 10:25:35


 

#include<stdio.h>

const int Maxn=26;
bool g[Maxn][Maxn];
int x[Maxn];
int n;

bool match(int pos)
{
    for(int i=0;i<pos;i++)
        if(g[pos][i]&&(x[pos]==x[i]))
            return false;
    return true;
}

void solve(int k)
{
    for(int i=0;i<n;i++)
        x[i]=0;

    int pos=0;
    while(pos>=0)
    {
        x[pos]++;
        while(x[pos]<=k&&!match(pos))
            x[pos]++;
        if(x[pos]<=k)
        {
            if(pos==n-1)    
                break;
            else
                pos++;
        }
        else
        {
            x[pos]=0;
            pos--;
        }
    }
}

int main()
{
    while(scanf("%d",&n),n)
    {
        getchar();
        char c;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                g[i][j]=false;
        for(int i=0;i<n;i++)
        {
            getchar();getchar();
            while((c=getchar())!='\n')
            {
                g[i][c-'A']=true;
            }
        }

        int k=0;
        do
        {
            k++;
            solve(k);
        }while(x[0]==0);

        if(k==1)
            printf("1 channel needed.\n");
        else
            printf("%d channels needed.\n",k);
    }
    return 0;
}

 

备注:

原本打算不限定总颜色数,但在无向图的遍历中存在访问的先后顺寻,导致后涂色的结点在先涂的不合理的结点的错误引导下涂色出错,比如(1-2-3-1,搜索顺序为第一点、第四点、第二点、第三点),因此还是设定颜色总数,在搜索的过程中不断调整,若达不到预定的颜色总数,则在回溯的过程中每个点都被清零,循环继续。

阅读(568) | 评论(0) | 转发(0) |
0

上一篇:图着色

下一篇:pku1325 Machine Schedule

给主人留下些什么吧!~~