Channel Allocation_四色定理
Description
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
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
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.
【题意】给出n个点,再给出n个点各自相邻的点,相邻的点不能是一个颜色,问至少需要几个颜色;
【思路】
对点i的染色操作:从最小的颜色开始搜索,当i的直接相邻(直接后继)结点已经染过该种颜色时,搜索下一种颜色。
就是说i的染色,当且仅当i的临近结点都没有染过该种颜色,且该种颜色要尽可能小。
参考:http://www.cnblogs.com/lyy289065406/archive/2011/07/31/2122590.html
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef class
{
public:
int next[];
int num;
}point;
int main()
{
int n;
while(~scanf("%d",&n),n)
{
getchar();//回车
point* a=new point[n+];
for(int i=;i<=n;i++)
{
getchar();//当前的点
getchar();//冒号
if(a[i].num<)
{
a[i].num=;//初始化
}
char ch;
while((ch=getchar())!='\n')
{
int tmp=ch%('A'-);//与当前的点相邻的点A->1,B->2...
a[i].next[++a[i].num]=tmp;//存入a[i]的next数组中
}
}
int color[];
memset(color,,sizeof(color));
color[]=;//第一点一定需要一种颜色
int maxcolor=;//至少需要一种颜色
for(int i=;i<=n;i++)
{
color[i]=n+;//先把第i个点的颜色置为最大
int vis[];
memset(vis,false,sizeof(vis));
for(int j=;j<=a[i].num;j++)
{
int k=a[i].next[j];//第i个点的第j个相邻的点
if(color[k]) vis[color[k]]=true;//如果他已经有颜色的话,就把那种颜色标记为true;
}
for(int j=;i<=n;j++)
{
if(!vis[j]&&color[i]>j)//如果j种颜色没用过,并且小于color[i]就把color[i]赋值为j;
{
color[i]=j;
break;
}
}
for(int i=;i<=n;i++)
{
if(maxcolor<color[i])
{
maxcolor=color[i]; }
if(maxcolor==) break;//最大的颜色不超过四种,根据四色定理
} } if(maxcolor==)
printf("1 channel needed.\n");
else printf("%d channels needed.\n",maxcolor);
delete a;
} return ;
}
Channel Allocation_四色定理的更多相关文章
- POJ 1129:Channel Allocation 四色定理+暴力搜索
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13357 Accepted: 68 ...
- POJ 1129 Channel Allocation 四色定理dfs
题目: http://poj.org/problem?id=1129 开始没读懂题,看discuss的做法,都是循环枚举的,很麻烦.然后我就决定dfs,调试了半天终于0ms A了. #include ...
- Channel Allocation(四色定理 dfs)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10897 Accepted: 5594 Description When ...
- POJ1129Channel Allocation[迭代加深搜索 四色定理]
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14601 Accepted: 74 ...
- 四色定理+dfs(poj 1129)
题目:Channel Allocation 题意:要求A:BCD,A与B,C,D都不相同,求不同的值,典型的四色定理: #include <iostream> #include <a ...
- Channel Allocation
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13231 Accepted: 6774 D ...
- poj1129 Channel Allocation(染色问题)
题目链接:poj1129 Channel Allocation 题意:要求相邻中继器必须使用不同的频道,求需要使用的频道的最少数目. 题解:就是求图的色数,这里采用求图的色数的近似有效算法——顺序着色 ...
- poj 1129 Channel Allocation ( dfs )
题目:http://poj.org/problem?id=1129 题意:求最小m,使平面图能染成m色,相邻两块不同色由四色定理可知顶点最多需要4种颜色即可.我们于是从1开始试到3即可. #inclu ...
- PKU 1129 Channel Allocation(染色问题||搜索+剪枝)
题目大意建模: 一个有N个节点的无向图,要求对每个节点进行染色,使得相邻两个节点颜色都不同,问最少需要多少种颜色? 那么题目就变成了一个经典的图的染色问题 例如:N=7 A:BCDEFG B:ACDE ...
随机推荐
- 172. Factorial Trailing Zeroes -- 求n的阶乘末尾有几个0
Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...
- 《JavaScript权威指南》读书笔记(三)
日期:2015-12-05 浏览器location和history: replace不会显示历史,location会: history对象脚本不能真正访问,但支持三种方法:back().foward( ...
- C语言实现统计字符个数
#include<stdio.h> int main() { int sz[10]={0},zm[26]={0},z[26]={0},i,space=0,e=0,t=0; ...
- node 日志管理log4js
node 日志管理log4js 一.默认的控制台输出 我们使用express框架时,开发模式用node或者supervisor启动nodejs应用时,控制台都是显示如下的日志. GET /css/bo ...
- 表单重置reset
最近一直在做各种页面的“增删改查”,只是在做新增功能的时候,自己一直在使用 reset来清空form表单,原以为这样子的清空方法是万无一失的,可惜最终还是在进行“修改”操作完了之后再“新增”的时候,就 ...
- Java如何将控制台上的结果保存到文件
无论是二进制数据还是字符数据(文本数据),都可以用文件输出流java.io.FileOutputStream,以字节流的方式保存到指定文件. package test; import java.io. ...
- 第三方开源水面波浪波形view:WaveView
一个比较有趣的Android第三方开源波形view:WaveView,这种WaveView在一些常见的APP开发中,以水面波浪波形的形象的生动展示手机还剩余多少电量,存储容量还有多少等,比较形象直观生 ...
- linux内核启动笔记
一. 1.解压 tar xjf linux-2.6.22.6.tar.bz2 2.打补丁 patch -p1 < ../linux-2.6.22.6_jz2440.patch 3.配置 ...
- SOD 精选细节--常用工具
要明白一个思想: SOD 只是帮你拼接sql语句, 用简单的方式来帮你实现. 不要理解错了.这很重要的! 查询: TB table=new TB(); table.Name="111& ...
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...