在一个区域内,有许多电台,如果覆盖有交集的话可能会互相干扰,唯一的解决方案就是使用不同的频道。
但是频道这种资源非常珍贵,所以应使用尽量少的频道。
感觉是模拟题,不知道为啥放在了搜索里面。Discuss里面有大牛说用四色定理,作为一名离散只考了70+的选手也没有去看......也可能是后台比较水,我的这种方法竟然也是0ms。
解题思路都写在了注释里。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cstdio> 6 7 using namespace std; 8 9 struct N 10 { 11 char data; 12 N *next; 13 }*head[27]; 14 15 bool hash[27][27],Num[27];//hash[][]标记每一个电台可以使用的频道或者已经使用过的频道 16 //Num[] 标记总共有多少频道被使用 17 18 N *creat() 19 { 20 N *p = (N *)malloc(sizeof(N)); 21 p->next = NULL; 22 return p; 23 } 24 25 void link(char h,char r)//建图 26 { 27 N *p,*q; 28 p = head[h-'A']; 29 q = creat(); 30 q->data = r; 31 q->next = p->next; 32 p->next = q; 33 } 34 35 void CheckChannel(char h) 36 { 37 int i; 38 39 for(i = 0;i < 26 && hash[h-'A'][i] != false; ++i)//尽量选取编号小的频道 40 ; 41 42 43 hash[h-'A'][i] = true;//标记该频道 表明此频道已使用 44 45 Num[i] = true; 46 47 N *p; 48 for(p = head[h-'A']->next; p != NULL; p = p->next)//和当前电台的有交集的 显然也不能使用当前频道 49 { 50 hash[p->data - 'A'][i] = true; 51 } 52 } 53 54 int main() 55 { 56 int n,i,sum; 57 char re[50]; 58 while(scanf("%d",&n) && n) 59 { 60 61 memset(hash,false,sizeof(hash)); 62 memset(Num,false,sizeof(Num)); 63 64 for(i = 0;i < n; ++i) 65 { 66 head[i] = creat(); 67 scanf("%s",re); 68 for(int j = 2,l = strlen(re);j < l; ++j) 69 { 70 link(re[0],re[j]); 71 } 72 } 73 for(i = 0;i < n; ++i)//枚举所有的电台 74 { 75 CheckChannel('A'+i); 76 } 77 for(sum = 0,i = 0;i < 27; ++i)//统计出现过的电台 78 if(Num[i]) 79 sum++; 80 81 printf("%d",sum); 82 if(sum == 1) 83 printf(" channel needed. "); 84 else 85 printf(" channels needed. "); 86 } 87 }
今天好顺啊 ,拿了第二个1A了....