poj 1129 四色原理DFS

23 篇文章 0 订阅

 

 

    如题: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值