L3-008 喊山 [BFS]
这题是一个简单的BFS。可以把这些点看成是迷宫上的格子,跟这座山相连就在这个格子旁画一个格子。这样就变成走迷宫问题了。
用邻接表建图。因为是一维的,可以直接用数组记录当前步数。代码应该很容易看懂,详见代码~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <cstdlib> #include <math.h> #include <queue> #include <vector> #define maxn 10005 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n,m,k,u,v,w; vector<int> ve[maxn]; int vis[maxn],step[maxn]; int BFS(int st) { int ret,t; queue<int> q; q.push(st); vis[st]=1; int maxx=0; while(!q.empty()) { t=q.front(); q.pop(); if(step[t]>maxx) { maxx=step[t]; ret=t; } else if(step[t]==maxx) ret=min(t,ret); for(int i=0;i<ve[t].size();i++) { if(!vis[ve[t][i]]) { q.push(ve[t][i]); vis[ve[t][i]]=1; step[ve[t][i]]=step[t]+1; } } } return ret; } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); ve[u].push_back(v); ve[v].push_back(u); } while(k--) { memset(vis,0,sizeof(vis)); memset(step,0,sizeof(step)); scanf("%d",&w); int ans=BFS(w); if(ans==w) printf("0\n"); else printf("%d\n",ans); } return 0; }