http://blog.csdn.net/lovelyloulou/archive/2010/03/13/5377886.aspx

//程序可能犯的错误是通不过非连通图的数据和一次搜索虽然成功着色却不是最优解的图的数据
/*
根据四色猜想,任何地图着色时满足相邻区域颜色不同的最小颜色数是4,所以图中每个节点可能有4种颜色,这里为4条信道
搜索即可得到最小需要的颜色数。
*/
#include <iostream>
#include <cstring>
using namespace std;
int map[27][27],chan[27];
int mmin,n;
bool ok(int i, int c)       //判断颜色是否合法
{
    for(int j=0;j<n;++j)
        if(map[i][j]&&c==chan[j])   //与之相邻并且颜色相同
            return false;
    return true;
}
void dfs(int i)
{
    if(i==n)
    {
        int m=0;
        for(int j=0;j<n;++j)
            if(m<chan[j])m=chan[j];
        if(mmin>m)mmin=m;
    }
    else
    {
        for(int c=0;c<4;++c)    //四色原理,只用试4种颜色即可
        {
            if(ok(i,c))
            {
                chan[i]=c;
                dfs(i+1);
                chan[i]=-1;
            }
        }
    }
}
int main()
{
 char ch[50];
 while(cin>>n&&n!=0)
 {
  memset(map,0,sizeof(map));

  for(int i=0;i<n;++i)
  {
   cin>>ch;
   if(strlen(ch)>2)
   {
    for(int j=2;j<strlen(ch);++j)
    {
     int k=ch[j]-65;
     map[i][k]=map[k][i]=1;
    }
   }
  }

  for(int k=0;k<n;++k)chan[k]=-1;

  mmin=5;     //最多4种颜色,所以令mmin=5
     dfs(0);
     mmin++;
     if(mmin>1)
        cout<<mmin<<" channels needed."<<endl;
     else cout<<mmin<<" channel needed."<<endl;
 }
 return 0;
}

posted on 2011-06-06 16:13  FreeAquar  阅读(212)  评论(0编辑  收藏  举报