【Tsinghua】无线广播(broadcast)
一个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
AC的代码:
#include <stdio.h>
#include <malloc.h>
int **map=NULL;
int *qUeue=NULL;
int *visited=NULL;
int head,tail;
int n,m;
//入队
void EnQueue(int data)
{
//tail 始终指向一个空位
qUeue[tail]=data;
tail++;
}
//出队
void DeQueue()
{
head++;
}
//判空
bool IsEmpty()
{
if(head==tail)
return true;
return false;
}
//取队首(不出队)
int getFront()
{
return qUeue[head];
}
//取第一个邻接点,有就返回第一个邻接点,否则返回-1
int GetFirstNeighbor(int v)
{
int i;
for(i=1;i<v;i++)
if(map[v][i]==1)
return i;
for(i=v+1;i<=n;i++)
if(map[i][v]==1)
return i;
return -1;
}
//取 (v,w) 的下一个邻接点,有就返回第一个邻接点,否则返回-1
int GetNextNeighbor(int v,int w)
{
int i;
if(w<v)
{
for(i=w+1;i<v;i++)
if(map[v][i]==1)
return i;
for(i=v+1;i<=n;i++)
if(map[i][v]==1)
return i;
}
if(v<w)
{
for(i=w+1;i<=n;i++)
if(map[i][v]==1)
return i;
}
return -1;
}
//visited[i]==-1 表示安装了频段1,visited[i]==0 表示还没有安装广播,visited[i]==1 表示安装了频段2.
int bfs()
{
head=tail=1;
int v,w;
v=1;
visited[v]=1;
EnQueue(v); //将v进队
while(IsEmpty()==false)
{
v=getFront(); //取队首元素至v(注意:不出队)
w=GetFirstNeighbor(v); //取v的第一个邻接点至w
while(w!=-1)
{
if(visited[w] == visited[v]) return -1;
if(visited[w] == 0) {visited[w] = -visited[v]; EnQueue(w);}
w=GetNextNeighbor(v, w); //取下一个邻接点
}
DeQueue(); //出队
}
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
int array=n+2;
//动态申请二维数组
map=(int **)malloc(sizeof(int *) * array);
int i;
for(i=1;i<array;i++)
*(map+i)=(int *)malloc(sizeof(int) * i);
//动态申请一维数组
visited=(int *)malloc(array*sizeof(int));
qUeue=(int *)malloc(array*sizeof(int));
int a,b;
int tmp;
//保证a<=b,只记录邻接矩阵的一半
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
if(b>a)
{
tmp=a;
a=b;
b=tmp;
}
map[a][b]=1;
}
int result=bfs();
printf("%d\n",result);
return 0;
}
最后更新:2017-04-03 05:39:38
上一篇:
【Tsinghua】旅行商(TSP)
下一篇:
机房收费系统之全局认识
Java EL系列-3.1.JUEL表达式工厂
【火热报名】2017 PHP全球开发者大会:6月10日举办
DT时代的融媒体大脑
C系列: 关于implicit declaration of function的warning
Javascript中的prototype
【云栖大会】阿里巴巴发布AliGenie 语音开放平台 “智联网”战略又落一子
别了,我的大学,我的朋友们
考察数据科学家支持向量机(SVM)知识的25道题,快来测测吧
微软开发轻量云端 “ Cloud Shell ”项目 Windows 界面
8月18日云栖精选夜读:阿里视频云最强转码技术揭秘:窄带高清原理解析+用户接入指南