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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}