poj1129 Channel Allocation(染色问题)
题目链接:poj1129 Channel Allocation
题意:要求相邻中继器必须使用不同的频道,求需要使用的频道的最少数目。
题解:就是求图的色数,这里采用求图的色数的近似有效算法——顺序着色算法(实质是一种贪心策略:在给任何一个顶点着色时,采用其邻接顶点中没有使用的,编号最小的颜色)。
注:中继器网络是一个平面图,即图中不存在相交的边。
看讨论后发现这组数据,AC代码没过orz:
6
A:BEF
B:AC
C:BD
D:CEF
E:ADF
F:ADE 正确答案应该是3 : A(1)B(2)C(3)D(1)E(2)F(3)但是AC的代码得出了错误答案4
数据弱啊ORZ。。。。。。
顺序着色算法(有问题的AC代码,毕竟这是求近似解,不能保证解最优):
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<algorithm>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std; const int N = ; char s[N];
int g[N][N];
int n, ans;
bool vis[N]; //每种颜色的使用标记
int color[N]; //各顶点的颜色
void greedy(){
int i, j;
for(i = ; i < n; ++i){
CLR(vis,);
for(j = ; j < n; ++j){
if(g[i][j] && color[j] != -){//邻接顶点j已经着色
vis[color[j]] = ;
}
}
for(j = ; j <= i; ++j){
//j为顶点i的所有邻接顶点中没有使用的,编号最小的颜色
if(!vis[j])break;
}
color[i] = j;//给i着色第j种颜色
}
for(i = ; i < n; ++i)
if(color[i] > ans)
ans = color[i];
ans++;
}
int main(){
int i, j, l;
while(~scanf("%d", &n),n){
CLR(g,);
ans = ;
for(i = ; i < n; ++i)
color[i] = -;
for(i = ; i < n; ++i){
scanf("%s", s);
l = strlen(s) - ; //与第i个中继器相邻的中继器数目
for(j = ; j < l; ++j){
g[i][s[j+]-'A'] = ;
g[s[j+]-'A'][i] = ;
}
}
greedy();
if(ans == )
printf("%d channel needed.\n", ans);
else
printf("%d channels needed.\n", ans);
}
return ;
}
在网上搜了一下,找到个正确的AC代码,用四色定理加深搜可解:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
const int N = ; char s[N];
int n, ans;
int color[N];
bool g[N][N];
bool jud(int x, int c){
for(int i = ; i < n; ++i)
if(i != x && g[x][i] && color[i] == c)
return ;
return ;
}
void dfs(int x){
if(x == n){
ans = min(ans, *max_element(color, color + n));
return;
}
for(int i = x; i < n; ++i){
for(int j = ; j <= ; ++j){
if(jud(i, j)){
color[i] = j;
dfs(i + );
}
}
}
}
int main(){
int i, j, l;
while(~scanf("%d",&n),n){
CLR(g,);
CLR(color,);
color[] = ;
ans = ;
for(i = ; i < n; ++i){
scanf("%s", s);
l = strlen(s) - ;
for(j = ; j < l; ++j){
g[i][s[j+]-'A'] = ;
g[s[j+]-'A'][i] = ;
}
}
dfs();
if(ans == )
printf("%d channel needed.\n", ans);
else
printf("%d channels needed.\n", ans);
}
return ;
}
poj1129 Channel Allocation(染色问题)的更多相关文章
- poj1129 Channel Allocation
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14361 Accepted: 73 ...
- 快速切题 poj1129 Channel Allocation
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12334 Accepted: 63 ...
- PKU 1129 Channel Allocation(染色问题||搜索+剪枝)
题目大意建模: 一个有N个节点的无向图,要求对每个节点进行染色,使得相邻两个节点颜色都不同,问最少需要多少种颜色? 那么题目就变成了一个经典的图的染色问题 例如:N=7 A:BCDEFG B:ACDE ...
- POJ-1129 Channel Allocation (DFS)
Description When a radio station is broadcasting over a very large area, repeaters are used to retra ...
- POJ 1129 Channel Allocation(DFS)
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13173 Accepted: 67 ...
- POJ 1129:Channel Allocation 四色定理+暴力搜索
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13357 Accepted: 68 ...
- 迭代加深搜索 POJ 1129 Channel Allocation
POJ 1129 Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14191 Acc ...
- Channel Allocation
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13231 Accepted: 6774 D ...
- Channel Allocation (poj 1129 dfs)
Language: Default Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12 ...
随机推荐
- 嵌套结构使用:struc1-struc2-XXX
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- CUBRID学习笔记17 事务的回滚
语法:ROLLBACK [ WORK ] 下面的语句会报错 ALTER TABLE code DROP s_name; INSERT INTO code (s_name, f_name) VALUES ...
- C# 线程(五):线程池
From : http://kb.cnblogs.com/page/42531/ 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然 ...
- iOS - OC 异常处理
1.@try 语句 @try { // Code that can potentially throw an exception 可能会抛出异常的代码块 statement . . . } @catc ...
- JavaScript基础知识之——Location 对象详解
属性 描述 location.hash 设置或取得 URL 中的锚 location.host 设置或取得 URL 中主机(包括端口号) location.hostname 设置或取得 URL 中的主 ...
- [转载] 每个 Python 程序员都要知道的日志实践
原文: http://python.jobbole.com/81666/ 在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果 ...
- 使用otl,报错:mysql Commands out of sync; you can't run this command now
1.代码如下: void TestCache(otl_connect& otlConn) { try { ] = {}; sprintf(sql,"call test1(1)&quo ...
- openwrt: Makefile 框架分析
openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...
- android设备休眠机制
如果一开始就对Android手机的硬件架构有一定的了解,设计出的应用程序通常不会成为待机电池杀手,而要设计出正确的通信机制与通信协议也并不困难.但如果不去了解而盲目设计,可就没准了. 首先Androi ...
- LA 5135 Mining Your Own Business
求出 bcc 后再……根据大白书上的思路即可. 然后我用的是自定义的 stack 类模板: #include<cstdio> #include<cstring> #includ ...