ACM/ICPC 之 数据结构-邻接表+BFS(TSH OJ-无线广播Broadcast)
这道题中若能够构成互不干扰的区域,其构成的图其实就是汉密尔顿路(Hamilton road),因此如果能够观察出来可以直接转化为汉密尔顿路的存在性证明,即便不能观察,我相信ACMer也能转化为BFS问题,这道题是一道很好的图论问题,对考察自己图论的基本功很有帮助。
无线广播(Broadcast)
描述
某广播公司要在一个地区架设无线广播发射装置。该地区共有n个小镇,每个小镇都要安装一台发射机并播放各自的节目。
不过,该公司只获得了FM104.2和FM98.6两个波段的授权,而使用同一波段的发射机会互相干扰。已知每台发射机的信号覆盖范围是以它为圆 心,20km为半径的圆形区域,因此,如果距离小于20km的两个小镇使用同样的波段,那么它们就会由于波段干扰而无法正常收听节目。现在给出这些距离小 于20km的小镇列表,试判断该公司能否使得整个地区的居民正常听到广播节目。
输入
第一行为两个整数n,m,分别为小镇的个数以及接下来小于20km的小镇对的数目。 接下来的m行,每行2个整数,表示两个小镇的距离小于20km(编号从1开始)。
输出
如果能够满足要求,输出1,否则输出-1。
输入样例
4 3
1 2
1 3
2 4
输出样例
1
限制
1 ≤ n ≤ 10000
1 ≤ m ≤ 30000
不需要考虑给定的20km小镇列表的空间特性,比如是否满足三角不等式,是否利用传递性可以推出更多的信息等等。
时间:2 sec
空间:256MB
提示
BFS
本题将一对距离小于20Km的小镇 模拟为 一对无向边结点,这样就可以生成一个多连通(不一定)无向图,原问题要求这一对小镇不能够放置同种频率的Broadcast,因此可以将问题比对树的层次遍历问题——父结点和子结点的数据不能相同,可化为图的广度优先搜索问题——结点和其邻接点的数据不能相同(利用BFS一层一层向外拓展并标记,找到一对邻接点数据相同则返回false,全部标记成功则返回true)。
具体而言:将任意一点作为源点入队(标记为1),向外将其所有邻接点入队(标记为-1),再将源点出队,再取队首点所有邻接点入队(标记为1),此判断有无邻接点为与队首同标记,有则返回false,没有则继续...
具体如下:
//邻接表+BFS-类似汉密尔顿路的存在证明
//这里用1标记源点,-1标记邻接点,1标记邻接点的邻接点,以此类推。(没有矛盾则存在)
//Time:39Ms Memory:13760Kb(No.8)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; #define MAX 10005 int n, m; //小镇数-相距20Km内小镇对数
int queue[MAX],head,tail; //模拟队列-队首-队尾
int cover; //Broadcast放置数量 //nextTown
struct Node{
int num;
Node *next;
Node(){ next = NULL; }
Node(int n, Node *nn) :num(n), next(nn){}
}; //小镇
struct Town{
int state; //状态
Node *nt; //nextTown
Town(){ state = ; nt = NULL;}
void insert(int num);
}town[MAX]; /*插入新边*/
void Town::insert(int num)
{
if (this->nt == NULL)
this->nt = new Node(num,NULL);
else this->nt = new Node(num,this->nt);
} bool BFS(int x)
{
queue[tail++] = x;
town[x].state = ;
cover++; //No.x被cover
while (head < tail)
{
Town cur = town[queue[head]]; //当前小镇
Node *tmp = cur.nt; //指向nextTown
while (tmp != NULL)
{
if (!town[tmp->num].state){
town[tmp->num].state = -cur.state; //cover不同Broadcast
cover++; //No.(tmp->num)被cover
queue[tail++] = tmp->num;
}
else if (town[tmp->num].state == cur.state) //被干扰
return false;
tmp = tmp->next;
}
head++;
}
return true;
} int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y); //d(x,y)<20Km
town[x].insert(y);
town[y].insert(x);
}
for (int i = ; i <= n; i++)
{
if (!town[i].state)
{
if (BFS(i) == false) //调用BFS-信号被干扰
{
printf("-1\n");
return ;
}
if (cover == n) //Place(放置)完毕
{
printf("1\n");
return ;
}
}
} return ;
}
小墨= =原创
ACM/ICPC 之 数据结构-邻接表+BFS(TSH OJ-无线广播Broadcast)的更多相关文章
- ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TSH OJ-旅行商TSP)
做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(T ...
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
- 图结构练习——BFS——从起始点到目标点的最短步数(邻接表+BFS)
图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 在古老的魔兽传说中.有两个军团,一个 ...
- 多源D点(邻接表+bfs)
[问题]给出一颗n个结点的树,树上每条边的边权都是1,这n个结点中有m个特殊点,请你求出树上距离这m个特殊点距离均不超过d的点的数量,包含特殊点本身. 输入: 输入第一行包含三个正整数,n.m.d分别 ...
- 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)
1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...
- ACM/ICPC 之 暴力打表(求解欧拉回路)-编码(POJ1780)
///找到一个数字序列包含所有n位数(连续)一次且仅一次 ///暴力打表 ///Time:141Ms Memory:2260K #include<iostream> #include< ...
- PAT天梯赛练习题——L3-008. 喊山(邻接表+BFS)
L3-008. 喊山 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂 ...
- SDUT OJ 图练习-BFS-从起点到目标点的最短步数 (vector二维数组模拟邻接表+bfs , *【模板】 )
图练习-BFS-从起点到目标点的最短步数 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 在古老的魔兽传说中,有两个军团,一个叫天 ...
- ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)
这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...
随机推荐
- vim如何进行分屏操作
文章转自:http://www.netingcn.com/vim-%E5%88%86%E5%B1%8F%E6%93%8D%E4%BD%9C.html 启动vim打开多个文件并分屏显示: vim -on ...
- shell学习之路:流程控制(for)
for循环的语法: 1. for 变量 in 值1 值2 值3.... do 程序 done 例如:下列脚本会分别打印4次 分别是morning noon afternoon evening的值 # ...
- ASP.NET中gridview获取当前行的索引值
在用GridView控件时,我们经常会碰到获取当前行的索引,通过索引进行许多操作.例如,可以获得当前行某一个控件元素:设置某一元素的值等等.下面结合实例介绍几种获得GridView当前行索引值的方法. ...
- JS,html压缩及混淆工具
现在已经出现了不少有自己特色的: JSMin Javascript compressor Packer Closure Compiler YUI Compressor Pretty Diff Java ...
- ggplo2学习笔记——基本图形类型
1.散点图:又称散点分布图,是以一个变量为恨坐标,另一个变量为纵坐标,利用散点(坐标点)的分布形态反映变量统计关系的一种图形.可以用来确认两个变量之间的关系.绘制自由曲线.矩阵关联分析等. 2.条形图 ...
- 吉他笔记 solo 和弦 推弦 音程
十二平均律: 如下图所示: 第一行为唱名:do re mi fa so.... 第二行为音名:C #C D #D E F #F G #G A #A B C 第三行为D调对应的音名,即1 = D 第四行 ...
- Redis学习笔记二:单机数据库的实现
1. 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个r ...
- HashMap原理分析
HashMap 实现Map.Cloneable.Serializable接口,继承AbstractMap基类. HashMap map = new HashMap(); 实例化一个HashMap,在构 ...
- linux 学习之路
很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...
- statusbar 样式
1:statusBar字体为白色 在plist里面设置View controller-based status bar appearance 为 NO:设置statusBarStyle 为 UISta ...