日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

天梯赛 喊山 bfs

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 天梯赛 喊山 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。