pat 喊山

時間限制
150 ms
內存限制
65536 kB
代碼長度限制
8000 B
判題程序
Standard
做者
陳越

喊山,是人雙手圍在嘴邊成喇叭狀,對着遠方高山發出「喂—喂喂—喂喂喂……」的呼喚。呼喚聲經過空氣的傳遞,迴盪於深谷之間,傳送到人們耳中,發出約定俗成的「訊號」,達到聲訊傳遞交流的目的。原來它是彝族先民用來求援呼救的「訊號」,慢慢地人們在生活實踐中發現了它的實用價值,便把它做爲一種交流工具世代傳襲使用。(圖文摘自: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 }
View Code
相關文章
相關標籤/搜索