【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日雲棲精選夜讀:阿裏視頻雲最強轉碼技術揭秘:窄帶高清原理解析+用戶接入指南