天梯赛练习 L3-008 喊山 (30分) bfs搜索
题目分析:
本题是一题比较简单的bfs搜索题,首先由于数据给的比较多不能直接开二维数组存放,而是用了vector的动态的二维数组的形式存放,对于每个出发点,我们bfs向四周搜索,标记搜索过的点,遇到搜过的点就可以停止搜索了,每次搜一个点就和全局的最远距离比较,更远则代替,相同则比较此时编号的大小,如果编号更小则也可以代替
本题代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<queue> 5 #include<vector> 6 #include<algorithm> 7 using namespace std; 8 9 const int N = 10005; 10 int vis[N]; 11 vector<int> v[N]; 12 int length, number, n, m, k; 13 struct Node{ 14 int id, len; 15 }; 16 17 void bfs(int x){ 18 number = 0; 19 length = 0; 20 memset(vis, 0, sizeof(vis)); 21 queue<Node> q; 22 Node sta; 23 sta.id = x; 24 sta.len = 0; 25 if(v[sta.id].size() == 0) printf("0\n"); 26 else{ 27 q.push(sta); 28 vis[sta.id] = 1; 29 while(!q.empty()){ 30 Node temp = q.front(); 31 q.pop(); 32 for(int i = 0; i < v[temp.id].size(); i++){ 33 int y = v[temp.id][i]; 34 if(vis[y] == 0){ 35 Node next; 36 next.id = y; 37 next.len = temp.len + 1; 38 if(next.len > length){ 39 length = next.len; 40 number = next.id; 41 }else if(next.len == length && next.id < number){ 42 number = next.id; 43 } 44 q.push(next); 45 vis[next.id] = 1; 46 } 47 } 48 } 49 printf("%d\n", number); 50 } 51 } 52 53 int main(){ 54 scanf("%d%d%d", &n, &m, &k); 55 for(int i = 1; i <= m; i++){ 56 int a, b; 57 scanf("%d%d", &a, &b); 58 v[a].push_back(b); 59 v[b].push_back(a); 60 } 61 for(int i = 1; i <= k; i++){ 62 int sta; 63 scanf("%d", &sta); 64 bfs(sta); 65 } 66 return 0; 67 }
如果有任何意见请在评论区积极留言