喊山,是人雙手圍在嘴邊成喇叭狀,對着遠方高山發出「喂—喂喂—喂喂喂……」的呼喚。呼喚聲經過空氣的傳遞,迴盪於深谷之間,傳送到人們耳中,發出約定俗成的「訊號」,達到聲訊傳遞交流的目的。原來它是彝族先民用來求援呼救的「訊號」,慢慢地人們在生活實踐中發現了它的實用價值,便把它做爲一種交流工具世代傳襲使用。(圖文摘自:http://news.xrxxw.com/newsshow-8018.html)ios
一個山頭呼喊的聲音能夠被臨近的山頭同時聽到。題目假設每一個山頭最多有兩個能聽到它的臨近山頭。給定任意一個發出原始信號的山頭,本題請你找出這個信號最遠能傳達到的地方。c++
輸入格式:ssh
輸入第一行給出3個正整數n、m和k,其中n(<=10000)是總的山頭數(因而假設每一個山頭從1到n編號)。接下來的m行,每行給出2個不超過n的正整數,數字間用空格分開,分別表明能夠聽到彼此的兩個山頭的編號。這裏保證每一對山頭只被輸入一次,不會有重複的關係輸入。最後一行給出k(<=10)個不超過n的正整數,數字間用空格分開,表明須要查詢的山頭的編號。ide
輸出格式:工具
依次對於輸入中的每一個被查詢的山頭,在一行中輸出其發出的呼喊可以連鎖傳達到的最遠的那個山頭。注意:被輸出的首先必須是被查詢的個山頭能連鎖傳到的。若這樣的山頭不僅一個,則輸出編號最小的那個。若此山頭的呼喊沒法傳到任何其餘山頭,則輸出0。spa
輸入樣例:7 5 4 1 2 2 3 3 1 4 5 5 6 1 4 5 7輸出樣例:
2 6 4 0
這是一道用bfs作的題目,今天新學到了一個c++容器 pair, 能夠能夠的。
對於pair類,能夠直接訪問其數據成員:其成員都是公有的,分別命名爲first和second,只須要使用普通的點操做符。
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<iostream> 5 #include<queue> 6 using namespace std; 7 const int maxn = 1e+4 + 10; 8 vector<int> ma[maxn]; 9 typedef pair<int,int>P; 10 int vis[maxn]; 11 int ans; 12 int ansi; 13 int bfs(int t) 14 { 15 int s; 16 queue<P> que; 17 que.push(P(t,0)); 18 ans = 0; 19 ansi = t; 20 vis[t] = 1; 21 while(!que.empty()) 22 { 23 P tmp =que.front(); 24 int x = tmp.first; 25 int y = tmp.second; 26 que.pop(); 27 if(ans==y) 28 { 29 ansi = min(ansi,x); 30 } 31 if(ans<y) 32 { 33 ans = y; 34 ansi = x; 35 } 36 for(int i = 0 ; i < ma[x].size() ; i ++) 37 { 38 if(!vis[ma[x][i]]) 39 { 40 que.push(P(ma[x][i],y+1)); 41 vis[ma[x][i]] = 1; 42 } 43 } 44 } 45 if(ans==0) 46 return 0; 47 return ansi; 48 } 49 int main() 50 { 51 int n, m, k; 52 cin >> n >> m >> k; 53 for(int i = 0 ; i < m ; i ++) 54 { 55 int a,b; 56 scanf("%d%d",&a,&b); 57 ma[a].push_back(b); 58 ma[b].push_back(a); 59 } 60 61 for(int i = 0 ; i < k ; i ++) 62 { 63 int tar ; 64 scanf("%d",&tar); 65 memset(vis,0,sizeof(vis)); 66 ans = 0; 67 ansi = 0; 68 ansi = bfs(tar); 69 cout << ansi <<endl; 70 71 } 72 return 0 ; 73 }