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.
题目链接:http://poj.org/problem?id=1129
解法类型:四色图问题
解题思路:这个题目暴力搜索也可以做出来,只是算法的效率很低。稍加转换一下就可以变成了四色图问题,即用n种颜色去涂地图,n<=4;这里可以看做最多有26种颜色,求最少的颜色数涂法。直接从每一点开始涂色就可以了,如果与当前发生冲突,则换一种颜色继续涂该点,否则当前点为该颜色。如此下去,直到全部涂色完。PS:这个算法的效率很高,status排名13,头一次这么靠前啊。。
算法实现:
//STATUS:C++_AC_0MS_120K
#include<stdio.h>
#include<memory.h>
const int MAXN=27;
int search();
int is_ok(int line,int tar);
char map[MAXN],vis[MAXN][MAXN];
int n,min;
int main()
{
// freopen("in.txt","r",stdin);
int i,j;
while(scanf("%d",&n)&&n)
{
min=0x80000000;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++){
scanf("%s",map);
for(j=0;map[j]!='\0';j++)
if(map[j]!=':')vis[i][map[j]-'A']=1;
}
search();
printf("%d ",min);
printf("%s needed.\n",min==1?"channel":"channels");
}
return 0;
}
int search()
{
int i,j,k;
for(i=0;i<n;i++){ //依次给每一点涂色
for(j=1;is_ok(i,j);j++); //是否冲突
if(j>min)min=j; //是否为最小值
for(k=0;k<n;k++) //标记
if(vis[k][i])vis[k][i]=j;
}
return 1;
}
int is_ok(int line,int tar) //判断与前面的状态是否冲突
{
int i,j;
for(i=0;i<line;i++){
if(vis[i][line]){
if(line==i)
for(j=0;j<line;j++){
if(vis[i][j]==tar)return 1; //冲突
}
else {
if(vis[i][i]==tar)return 1; //冲突
}
}
}
return 0; //不冲突
}
本文探讨了在大型区域广播系统中使用重复器的最小通道需求问题,并介绍了如何通过四色图问题解决这一挑战。文章详细阐述了算法实现步骤,包括输入解析、搜索过程及输出结果呈现,旨在提供一种高效且易于理解的方法来确定所需通道数量。
443





