博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACM/ICPC 之 数据结构-邻接表+BFS(TSH OJ-无线广播Broadcast)
阅读量:4938 次
发布时间:2019-06-11

本文共 3190 字,大约阅读时间需要 10 分钟。

这道题中若能够构成互不干扰的区域,其构成的图其实就是汉密尔顿路(Hamilton road),因此如果能够观察出来可以直接转化为汉密尔顿路的存在性证明,即便不能观察,我相信ACMer也能转化为BFS问题,这道题是一道很好的图论问题,对考察自己图论的基本功很有帮助。

 


 

无线广播(Broadcast)


描述

某广播公司要在一个地区架设无线广播发射装置。该地区共有n个小镇,每个小镇都要安装一台发射机并播放各自的节目。

不过,该公司只获得了FM104.2和FM98.6两个波段的授权,而使用同一波段的发射机会互相干扰。已知每台发射机的信号覆盖范围是以它为圆 心,20km为半径的圆形区域,因此,如果距离小于20km的两个小镇使用同样的波段,那么它们就会由于波段干扰而无法正常收听节目。现在给出这些距离小 于20km的小镇列表,试判断该公司能否使得整个地区的居民正常听到广播节目。

输入

第一行为两个整数n,m,分别为小镇的个数以及接下来小于20km的小镇对的数目。 接下来的m行,每行2个整数,表示两个小镇的距离小于20km(编号从1开始)。

输出

如果能够满足要求,输出1,否则输出-1。

输入样例

4 31 21 32 4

输出样例

1

限制

1 ≤ n ≤ 10000

1 ≤ m ≤ 30000

不需要考虑给定的20km小镇列表的空间特性,比如是否满足三角不等式,是否利用传递性可以推出更多的信息等等。

时间:2 sec

空间:256MB

提示

BFS


 

 

  本题将一对距离小于20Km的小镇 模拟为 一对无向边结点,这样就可以生成一个多连通(不一定)无向图,原问题要求这一对小镇不能够放置同种频率的Broadcast,因此可以将问题比对树的层次遍历问题——父结点和子结点的数据不能相同,可化为图的广度优先搜索问题——结点和其邻接点的数据不能相同(利用BFS一层一层向外拓展并标记,找到一对邻接点数据相同则返回false,全部标记成功则返回true)。

  具体而言:将任意一点作为源点入队(标记为1),向外将其所有邻接点入队(标记为-1),再将源点出队,再取队首点所有邻接点入队(标记为1),此判断有无邻接点为与队首同标记,有则返回false,没有则继续...

 

具体如下:

  

1 //邻接表+BFS-类似汉密尔顿路的存在证明 2 //这里用1标记源点,-1标记邻接点,1标记邻接点的邻接点,以此类推。(没有矛盾则存在) 3 //Time:39Ms  Memory:13760Kb(No.8) 4 #include
5 #include
6 #include
7 using namespace std; 8 9 #define MAX 1000510 11 int n, m; //小镇数-相距20Km内小镇对数12 int queue[MAX],head,tail; //模拟队列-队首-队尾13 int cover; //Broadcast放置数量14 15 //nextTown16 struct Node{17 int num;18 Node *next;19 Node(){ next = NULL; }20 Node(int n, Node *nn) :num(n), next(nn){}21 };22 23 //小镇24 struct Town{25 int state; //状态26 Node *nt; //nextTown27 Town(){ state = 0; nt = NULL;}28 void insert(int num);29 }town[MAX];30 31 /*插入新边*/32 void Town::insert(int num)33 {34 if (this->nt == NULL)35 this->nt = new Node(num,NULL);36 else this->nt = new Node(num,this->nt);37 }38 39 bool BFS(int x)40 {41 queue[tail++] = x;42 town[x].state = 1;43 cover++; //No.x被cover44 while (head < tail)45 {46 Town cur = town[queue[head]]; //当前小镇47 Node *tmp = cur.nt; //指向nextTown48 while (tmp != NULL)49 {50 if (!town[tmp->num].state){51 town[tmp->num].state = -cur.state; //cover不同Broadcast52 cover++; //No.(tmp->num)被cover53 queue[tail++] = tmp->num;54 }55 else if (town[tmp->num].state == cur.state) //被干扰56 return false;57 tmp = tmp->next;58 }59 head++;60 }61 return true;62 }63 64 int main()65 {66 scanf("%d%d", &n, &m);67 for (int i = 0; i < m; i++)68 {69 int x, y;70 scanf("%d%d", &x, &y); //d(x,y)<20Km71 town[x].insert(y);72 town[y].insert(x);73 }74 for (int i = 1; i <= n; i++)75 {76 if (!town[i].state)77 {78 if (BFS(i) == false) //调用BFS-信号被干扰79 {80 printf("-1\n");81 return 0;82 }83 if (cover == n) //Place(放置)完毕84 {85 printf("1\n");86 return 0;87 }88 }89 }90 91 return 0;92 }
小墨= =原创

 


 

转载于:https://www.cnblogs.com/Inkblots/p/5000119.html

你可能感兴趣的文章
oldboy第四天学习
查看>>
无论怎样,拒绝了
查看>>
Discuz API的延伸
查看>>
C/C++(C++内存管理,内联函数,类型转换,命名空间,string类)
查看>>
CentOS下一键安装Openstack
查看>>
【leetcode】Binary Tree Level Order Traversal I & II
查看>>
【NOIP2015】斗地主
查看>>
uva 10537 Toll! Revisited(优先队列优化dijstra及变形)
查看>>
MySQL对时间的处理总结
查看>>
笔记四:python乱码深度剖析二
查看>>
《PHP程序员面试笔试宝典》——如何回答技术性的问题?
查看>>
【转载】Amit’s A star Page 中译文
查看>>
GitHub Blog创建以及本地管理
查看>>
注册谷歌账号并验证时显示号码无法用于验证的问题
查看>>
Hive 变量和属性
查看>>
验证邮箱合法性的一些测试样例
查看>>
Python安装第三方库 xlrd 和 xlwt 。处理Excel表格
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
查看>>
细说sqlserver索引及SQL性能优化原则
查看>>