PTA喊山

一、题目描述

 

 二、解题思路

  一个普通的bfs模板题,但是要用链式前向星优化内存,不然机会内存超限。在bfs过程中不断更新答案,也就是最小点。

三、代码实现

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int heads[10010];
 4 struct node{
 5     int u,v;
 6     int nxt;
 7 }e[300010];
 8 struct popo{
 9     int u;
10     int s;
11 };
12 bool vis[10010];
13 int n,m,k;
14 int cnt;
15 void init()
16 {
17     for(int i = 1;i <= 10000;i++)
18         heads[i] = -1;
19 }
20 void add(int u,int v)
21 {
22     e[cnt].u = u;
23     e[cnt].v = v;
24     e[cnt].nxt = heads[u];
25     heads[u] = cnt;
26     cnt++;
27 }
28 int bfs(int u)
29 {
30     queue <popo> que;
31     que.push({u,0});
32     int mdis = 0;
33     int ans = 0;
34     while(!que.empty()){
35         popo v = que.front();
36         vis[v.u] = true;
37         que.pop();
38         if(v.s > mdis){
39             mdis = v.s;
40             ans = v.u;
41         }
42         else if(v.s == mdis)
43                 if(ans > v.u)
44                     ans = v.u;
45         for(int i = heads[v.u];i != -1;i = e[i].nxt){
46             if(e[i].v == -1 || vis[e[i].v])
47                 continue;
48             que.push({e[i].v,v.s + 1});
49             vis[e[i].v] = true;
50         }
51     }
52     return ans;
53 }
54 int main()
55 {
56     ios::sync_with_stdio(false);
57     cin >> n >> m >> k;
58     init();
59     while(m--){
60         int u,v;
61         cin >> u >> v;
62         add(u,v);
63         add(v,u);
64     }
65     while(k--){
66         int u;
67         cin >> u;
68         int ans;
69         memset(vis,0,sizeof(vis));
70         ans = bfs(u);
71         cout << ans << endl;
72     }
73     return 0;
74 }
posted @ 2022-03-19 15:21  scannerkk  阅读(28)  评论(0)    收藏  举报