poj 1129 四色原理DFS

来源:互联网 发布:linux httpd配置文件 编辑:程序博客网 时间:2024/06/07 01:24

 

 

    如题: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;
}

 

0 0