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)
这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...
随机推荐
- Ubuntu14.04 LTS更新源
Ubuntu14.04 LTS更新源 不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就行),选择最快的源可以节省大批下载时间. 首先备份源列表: sudo cp ...
- java调用存储过程
在做java调用sqlserver存储过程时遇到了各种各样的问题,不过在不懈的努力之下这些问题还是得以解决了.今天总结一下遇到的问题以及解决的方法. 首先调用存储过程的方法大家都很清楚: String ...
- wamp包--如何导出sql
在windows下安装wamp,如果不想用phpmyadmin工具和其他工具,如何导出自己想要的sql呢. 比如:我想导出blogyaf库,可以从以下步骤进行操作. 1,进入到wamp的mysql安装 ...
- openssh for windows安装
openssh for windows安装 2009-11-22 22:43:58 分类: WINDOWS 本文转自:http://blog.chinaunix.net/uid-7541208-id ...
- 高效率http页面优化法则一【JS对DOM的操作】
高效http页面优化法则一很多人都认为JS的效率太慢了,都不愿意用js来实现相对困难一点的程序逻辑.在这里我要说的是其实js的效率并不慢,慢的是DOM,如果操作好DOM,你的js效率将提高接近千倍(这 ...
- 正确地组织python项目的结构
统一的项目结构 写了不少python项目后, 越来越认识到python项目结构重要性. 不管项目是否要开源, 是否要提交pypi, 项目结构的一致性带来的好处还有很多: 多人合作开发大家都有个基本的g ...
- [译]git clean
git clean命令用来从你的工作目录中删除所有没有tracked过的文件. git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以 ...
- 图解Tomcat类加载机制
说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷. 之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,与我们自己的web项目整合后无法直接断点调试.后来同 ...
- MMTx使用说明
MMTx(MetaMap Transfer)是美国国家医学图书馆建立的用于文本数据挖掘的一种工具. 下面以Medine格式数据为例介绍使用方法 1.在PubMed数据库检索相关的文献. 2.将数据结果 ...
- ZOJ 3201 Tree of Tree
树形DP.... Tree of Tree Time Limit: 1 Second Memory Limit: 32768 KB You're given a tree with weig ...