Channel Allocation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 13357   Accepted: 6836

Description

When a radio station is broadcasting over a very large area, repeaters are used to retransmit the signal so that every receiver has a strong signal. However, the channels used by each repeater must be carefully chosen so that nearby repeaters do not interfere
with one another. This condition is satisfied if adjacent repeaters use different channels. 



Since the radio frequency spectrum is a precious resource, the number of channels required by a given network of repeaters should be minimised. You have to write a program that reads in a description of a repeater network and determines the minimum number of
channels required.

Input

The input consists of a number of maps of repeater networks. Each map begins with a line containing the number of repeaters. This is between 1 and 26, and the repeaters are referred to by consecutive upper-case letters of the alphabet starting with A. For example,
ten repeaters would have the names A,B,C,...,I and J. A network with zero repeaters indicates the end of input. 



Following the number of repeaters is a list of adjacency relationships. Each line has the form: 



A:BCDH 



which indicates that the repeaters B, C, D and H are adjacent to the repeater A. The first line describes those adjacent to repeater A, the second those adjacent to B, and so on for all of the repeaters. If a repeater is not adjacent to any other, its line
has the form 



A: 



The repeaters are listed in alphabetical order. 



Note that the adjacency is a symmetric relationship; if A is adjacent to B, then B is necessarily adjacent to A. Also, since the repeaters lie in a plane, the graph formed by connecting adjacent repeaters does not have any line segments that cross. 

Output

For each map (except the final one with no repeaters), print a line containing the minumum number of channels needed so that no adjacent channels interfere. The sample output shows the format of this line. Take care that channels is in the singular form when
only one channel is required.

Sample Input

2
A:
B:
4
A:BC
B:ACD
C:ABD
D:BC
4
A:BCD
B:ACD
C:ABD
D:ABC
0

Sample Output

1 channel needed.
3 channels needed.
4 channels needed.

题意是给了一堆的信号辐射塔,然后给了各个塔之间的关系,A:BCD代表A与B塔,A与C塔,A与D塔相邻,这样的话A就不能与B、C、D塔中的任何一个使用相同的辐射频率。问在给定关系的情况下,最少使用多少种辐射频率。

和小时候接触的世界地图的染色方案一样,相邻国家不能使用同一种颜色。这样最多就4种颜色。

这道题折磨了我颇久,用dfs一直不对,结果看了discuss发现顺序染色是不对的。

看给定数据:

6
A:BEF
B:AC
C:BD
D:CEF
E:ADF
F:ADE
3 channels needed.
即:A(1)B(2)C(3)D(1)E(2)F(3)

贪心做法是不对的,还是暴力搜吧,反正一共就26个点,四种颜色换着法地涂,看最后最少能用多少种颜色。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; int n, maxn;
string test;
int grid[30][30]; void dfs(int step,int color[], int cap)
{
if (step == n )
{
maxn = min(maxn, cap);
return;
}
int i, j;
for (i = 1; i <= 4; i++)//根据四色定理可知,一共四种颜色。所以暴力搜索,把所有符合条件的颜色都染着试一下
{
for (j = 0; j < 26; j++)
{
if (grid[step][j] == 1 && color[j] == i)
break;
}
if (j == 26)//如果这个颜色符合条件
{
color[step] = i;
dfs(step + 1, color, max(cap, i));
color[step] = 0;
}
}
} int main()
{
int i, j, k, len;
int color[30];
while (cin >> n)
{
if (n == 0)
break;
memset(grid, 0, sizeof(grid));
memset(color, 0, sizeof(color));
maxn = 10; for (i = 0; i < n; i++)
{
cin >> test;
len = test.length(); if (len == 2)
continue;
k = test[0] - 'A';
for (j = 2; j < len; j++)
{
grid[k][test[j] - 'A'] = 1;
grid[test[j] - 'A'][k] = 1;
}
}
dfs(0,color,0); if (maxn == 1)
{
cout <<"1 channel needed." << endl;
}
else
{
cout << maxn <<" channels needed. "<< endl;
}
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 1129:Channel Allocation 四色定理+暴力搜索的更多相关文章

  1. POJ 1129 Channel Allocation 四色定理dfs

    题目: http://poj.org/problem?id=1129 开始没读懂题,看discuss的做法,都是循环枚举的,很麻烦.然后我就决定dfs,调试了半天终于0ms A了. #include ...

  2. 迭代加深搜索 POJ 1129 Channel Allocation

    POJ 1129 Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14191   Acc ...

  3. PKU 1129 Channel Allocation(染色问题||搜索+剪枝)

    题目大意建模: 一个有N个节点的无向图,要求对每个节点进行染色,使得相邻两个节点颜色都不同,问最少需要多少种颜色? 那么题目就变成了一个经典的图的染色问题 例如:N=7 A:BCDEFG B:ACDE ...

  4. POJ 1129 Channel Allocation(DFS)

    Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13173   Accepted: 67 ...

  5. POJ 1129 Channel Allocation DFS 回溯

    Channel Allocation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15546   Accepted: 78 ...

  6. poj 1129 Channel Allocation ( dfs )

    题目:http://poj.org/problem?id=1129 题意:求最小m,使平面图能染成m色,相邻两块不同色由四色定理可知顶点最多需要4种颜色即可.我们于是从1开始试到3即可. #inclu ...

  7. poj 1129 Channel Allocation

    http://poj.org/problem?id=1129 import java.util.*; import java.math.*; public class Main { public st ...

  8. poj 1129 Channel Allocation(图着色,DFS)

    题意: N个中继站,相邻的中继站频道不得相同,问最少需要几个频道. 输入输出: Sample Input 2 A: B: 4 A:BC B:ACD C:ABD D:BC 4 A:BCD B:ACD C ...

  9. poj 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)

    题目链接 看到分类里是dp,结果想了半天,也没想出来,搜了一下题解,全是暴力! 不过剪枝很重要,下面我的代码 266ms. 题意: 在一个矩阵方格里面,青蛙在里面跳,但是青蛙每一步都是等长的跳, 从一 ...

随机推荐

  1. C++面试常见问题——17类模板的使用

    类模板的使用 注意在每次类模板函数时都需要声明一个类模板 #include<iostream> using namespace std; template <class T,int ...

  2. 6 应用Nginx之后

    以上的问题,涉及到Varnish

  3. Educational Codeforces Round 63 选做

    D. Beautiful Array 题意 给你一个长度为 \(n\) 的序列.你可以选择至多一个子段,将该子段所有数乘上给定常数 \(x\) .求操作后最大的最大子段和. 题解 考虑最大子段和的子段 ...

  4. 【剑指Offer】面试题32 - I. 从上到下打印二叉树

    题目 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回: [3 ...

  5. Python 操作 sqlite

    代码示例 #导入sqlite3库 import sqlite3 #连接数据库 conn = sqlite3.connect("customers.db") #创建表,主键id自增 ...

  6. ROS常用库(一) fake_localization

    wiki是最好的学习资料,以下直接参考了wiki官网.另外po出官网网址,建议英语较好的朋友之接看原版 http://wiki.ros.org/fake_localization 概述 fake_lo ...

  7. centos6.5搭建hadoop单节点

    1.添加用户 groupadd  hadoop useradd -d /home/hadoop -m hadoop -g hadoop passwd hadoop    修改密码 付给用户sudo权限 ...

  8. Jrebel 远程热部署[Idea]

    服务器端 客户端-idea remote module 在服务器端,Tomcat的webapps下新建项目文件夹,如: demo/WEB-INF/classes/[jrebel.xml]

  9. 八十七、SAP中ALV事件之一,事件的声明

    一.我们双击"REUSE_ALV_GRID_DISPLAY",来到SE37界面, 二,来到这儿,点击SLIS_T_EVENT, 三.可以看到SLIS_T_EVENT的定义,有一个n ...

  10. PHP笔记03

    PHP表单 获取表单数据 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...