天梯赛 喊山 bfs
喊山,是人雙手圍在嘴邊成喇叭狀,對著遠方高山發出“喂—喂喂—喂喂喂……”的呼喚。呼喚聲通過空氣的傳遞,回蕩于深谷之間,傳送到人們耳中,發出約定俗成的“訊號”,達到聲訊傳遞交流的目的。原來它是彝族先民用來求援呼救的“訊號”,慢慢地人們在生活實踐中發現了它的實用價值,便把它作為一種交流工具世代傳襲使用。
一個山頭呼喊的聲音可以被臨近的山頭同時聽到。題目假設每個山頭最多有兩個能聽到它的臨近山頭。給定任意一個發出原始信號的山頭,本題請你找出這個信號最遠能傳達到的地方。
輸入格式:
輸入第一行給出3個正整數n、m和k,其中n(≤10000)是總的山頭數(于是假設每個山頭從1到n編號)。接下來的m行,每行給出2個不超過n的正整數,數字間用空格分開,分別代表可以聽到彼此的兩個山頭的編號。這里保證每一對山頭只被輸入一次,不會有重復的關系輸入。最后一行給出k(≤10)個不超過n的正整數,數字間用空格分開,代表需要查詢的山頭的編號。
輸出格式:
依次對于輸入中的每個被查詢的山頭,在一行中輸出其發出的呼喊能夠連鎖傳達到的最遠的那個山頭。注意:被輸出的首先必須是被查詢的個山頭能連鎖傳到的。若這樣的山頭不只一個,則輸出編號最小的那個。若此山頭的呼喊無法傳到任何其他山頭,則輸出0。
輸入樣例:
7 5 4 1 2 2 3 3 1 4 5 5 6 1 4 5 7輸出樣例:
2 6 4 0思路:
這道題是常規題,用圖的bfs遍歷即可AC本題,不需要其他的技巧進行優化。
不過這類題我在實際編寫的時候,發現使用dfs計算層數的時候總會出現一些問題,過不了全部的測試點,原因還在自查中…可能是需要一些方法吧,所所以我們在做這類有關“計算層數”的題目時,建議首先選擇bfs。
參考代碼
#include<bits/stdc++.h> using namespace std; int n, m, k; vector<int> e[10005]; int vis[10005]; struct node{int v;int level; }; int maxd, maxi;void bfs(int v) {queue<node> q;node t, temp;t.v = v;t.level = 1;vis[v] = true;q.push(t);while(!q.empty()){t = q.front();if(t.level > maxd){maxd = t.level;maxi = t.v;}else if(t.level == maxd && t.v < maxi)maxi = t.v;q.pop();for(int i = 0; i < e[t.v].size(); i++)if(vis[e[t.v][i]] == false){temp.v = e[t.v][i];temp.level = t.level + 1;q.push(temp);vis[temp.v] = true;}} }int main() {scanf("%d %d %d", &n, &m, &k);int a, b;for(int i = 0; i < m; i++){scanf("%d %d", &a, &b);e[a].push_back(b);e[b].push_back(a);}int temp;for(int i = 0; i < k; i++){scanf("%d", &temp);memset(vis, false, sizeof(vis));if(e[temp].size() == 0){printf("0\n");continue;}maxd = -1;bfs(temp);printf("%d\n", maxi);}return 0; }總結
以上是生活随笔為你收集整理的天梯赛 喊山 bfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nexium胃药中文说明书
- 下一篇: 熬夜会影响性功能吗