POJ 1129 Channel Allocation

  在一个区域内,有许多电台,如果覆盖有交集的话可能会互相干扰,唯一的解决方案就是使用不同的频道。

  但是频道这种资源非常珍贵,所以应使用尽量少的频道。

  感觉是模拟题,不知道为啥放在了搜索里面。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.\n");
84         else
85             printf(" channels needed.\n");
86     }
87 }

 

 

  今天好顺啊 ,拿了第二个1A了....

  

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值