GMS通信算法题(着色问题)
题目描述
在GSM通信系统中,为了避免相邻基站之间的干扰要求相邻的基站之间不能采用相同的频率来进行通信。 由于频率资源有限,因此就要求基站所占用的频率资源越少越好。
输入要求:
输入包含某地区的基站之间的相邻情况。输入的第一行为一个整数n,表示有多少个邻接信息。后面的n行每一行包含一个邻接关系,每一行的形式如下:
A:BCDH
其中A 表示某给基站的名称,:后的每一个字母都表示一个基站的名称,表示与A相邻的基站,基站数量在126之间,分别对应126个字母。如果某个基站没有相邻的基站,则形式如下:
B:
表示没有与基站B相邻的基站。
输出要求:
输出只有一行,一个整数,也就是需要的最少的频率数。
样例输入:
4
A:BCD
B:ACD
C:ABD
D:ABC
样例输出:
4
算法思想
通过判断每个基站是否可以使用与其不邻接的基站的频率,或使用新的频率来创建空间树木。
而判断条件为:遍历判断之前已经确定频率的基站是否与该基站邻接。
-
若不邻接,考虑是否使用遍历到基站的频率。 判读条件为:是否有与该 基站邻接的某个基站也使用了该频率,如果是。则将该基站频率置为0;
-
不是,就可以使用该频率。
在遍历完成后,若该基站频率还是0,说明没有符合条件的可以重使用的频率。则将使用频率种类数加1,并将该基站频率赋该新值。
C++ 源代码
#include<iostream>
#include<string.h>
using namespace std;
#define MAX 26
class Solution{
private:
int Array[MAX][MAX];
int n;
int ColorRecord[MAX];
public:
int ColorNum;
void Initial(){
memset(Array, 0, sizeof(Array));
memset(ColorRecord, 0, sizeof(ColorRecord));
cout << "Input Num:\n";
cin >> n;
getchar();
cout << "Input the relationship:\n";
char temp;
for (int i = 1; i <= n; i++){
temp = i + 64;
cout << temp << ":";
for (int j = 1; j <= n; j++){
temp = getchar();
if(temp == '\n')
break;
else
Array[i][temp - 64] = 1;
if(j == n)
getchar();
}
}
//show(Array , n);
}
// void show(int Array[MAX], int n){
// for (int i = 1; i <= n; i++){
// cout << Array[i]<<" ";
// }
// }
void GetColorNum(){
ColorNum = 0;
dfs(1);
// show(ColorRecord, n);
}
void dfs(int i){
int TempColor;
int flag = 0;
if(i == n + 1 ){
return;
}
if (i == 1){
ColorNum++;
ColorRecord[i] = i;
dfs(2);
return;
}else{
for (int j = 1; j < i; j++){
if (Array[i][j] == 0){
ColorRecord[i] = ColorRecord[j];
for (int k = 1; k < i;k++){
if(ColorRecord[k] == ColorRecord[i] && Array[i][k] == 1){
ColorRecord[i] = 0;
}
}
}
}
if(ColorRecord[i] == 0){
ColorNum++;
ColorRecord[i] = ColorNum;
}
dfs(i + 1);
return;
}
}
};
int main()
{
Solution s;
s.Initial();
s.GetColorNum();
cout << s.ColorNum;
return 1;
}