poj1129——Channel Allocation

来源:互联网 发布:声音剪辑软件 编辑:程序博客网 时间:2024/05/16 08:05

题目大意:相邻中继器不能设置相同频道,否则会干扰信号,问在这个中继器网络中最少设置多少个频道

输入:(有很多case,输入以0结束)

            第i个case中地图包含的中继器个数n(1<=n<=26)

            第k个中继器的序号:与它相邻的站点序号(序号用大写字母表示,如果没有相邻站点则输入为A:)

输出:? channel(s) needed(注意如果?为1则channel为单数形式)

分析:dfs搜索,其实本题就是一个点着色问题,相邻点必须着不同颜色

           每个点的子结点就是它能选择的颜色,在当前这些种颜色下,如果对这个点dfs结束还无解,就加一种颜色重新对这个结点进行dfs

代码:转载自http://blog.csdn.net/non_cease/article/details/7313613

  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cstring>  
  4. using namespace std;  
  5.   
  6. #define M 26  
  7.   
  8. int n, ans, color[M];   
  9. bool map[M][M], isFind;  
  10.   
  11. bool ok(int x, int c) {   //判断是否存在相邻节点颜色相同  
  12.      for (int i = 0; i < n; i++)  
  13.         if (map[x][i] && c == color[i])  
  14.             return false;  
  15.      return true;  
  16. }  
  17.   
  18. void DFS(int id, int total) {   //当前搜索到下标为id的节点,此时总共用的色彩数为total  
  19.      if (isFind) return;  
  20.      if (id >= n) { isFind = truereturn; }  //当所有节点都被着色后,返回  
  21.   
  22.      for (int i = 1; i <= total; i++) {  
  23.          if (ok(id, i)) {  
  24.             color[id] = i;  
  25.             DFS(id+1, total);  
  26.             color[id] = 0;  
  27.          }  
  28.      }  
  29.      if (!isFind) {    //当用total种颜色无法完成时,则增加一种颜色进行着色  
  30.         ans++;  
  31.         DFS(id, total+1);  
  32.      }  
  33. }  
  34.   
  35. int main()  
  36. {  
  37.     int i, j;  
  38.     char s[M];  
  39.   
  40.     while (scanf ("%d", &n) && n) {  
  41.           getchar();  
  42.           memset (map, falsesizeof (map));  
  43.           memset (color, 0, sizeof (color));  
  44.           for (i = 0; i < n; i++) {  
  45.                gets(s);  
  46.                for (j = 2; s[j] != '\0'; j++)  
  47.                    map[s[0]-'A'][s[j]-'A'] = true;  
  48.           }  
  49.           isFind = false;  
  50.           ans = 1;  
  51.           DFS(0, 1);  
  52.           if (ans == 1)  
  53.               printf ("1 channel needed.\n");  
  54.           else printf ("%d channels needed.\n", ans);  
  55.     }  
  56.     return 0;  
  57. }

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脸过敏好了还红怎么办 脸过过敏红肿痒怎么办 腰间盘突出压迫神经腿麻怎么办 腰椎盘突出脚麻怎么办 水泡破了化脓了怎么办 泰迪口臭很严重怎么办 狗狗的嘴巴好臭怎么办 2岁宝宝有口臭怎么办 2岁半宝宝口臭怎么办 胃热引起的口臭怎么办 脑梗右手不能动怎么办 脑梗右手不灵活怎么办 冒冷汗头晕想吐怎么办 脸中风嘴歪了怎么办 耳朵里疱疹破了怎么办 吃了变质的米饭怎么办 吃了变质的蛋糕怎么办 吃了变质的饭怎么办 颈椎病犯了头晕恶心怎么办 感冒引起的耳朵疼怎么办 感冒了左耳朵疼怎么办 受风引起的面瘫怎么办 两边的脸不一样大怎么办 脖子扭到怎么办快速好 卡马西平片过量怎么办 天冷眼睛神经跳怎么办 每天失眠怎么办要疯了 老是失眠是怎么办才好 汗毛又多又长怎么办 脸上出油毛孔粗大黑头怎么办 毛长在皮肤里怎么办 腰韧带拉伤怎么办恢复快 脚扭伤伤了韧带怎么办 膝关节韧带拉伤怎么办恢复快 脚踝韧带拉伤怎么办恢复快 脚扭伤一年没好怎么办 脚扭伤半年还疼怎么办 脚崴过有后遗症怎么办 脚扭伤脚面肿了怎么办 腰突然扭了好痛怎么办 腰扭伤了怎么办最有效