L3-008. 喊山 天梯初賽
阿新 • • 發佈:2018-11-20
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; int N,M,K; vector<int> G[10001]; struct node{ int num; int level; }; int vis[10001],pro[10001]; int ans,level; int bfs(int num){ vis[num]=1; queue<node> q; struct node p,t; p.num=num; p.level=0; q.push(p); while(!q.empty()){ t=q.front(); q.pop(); if(level<t.level){//思路找出同一層中編號最小的。 ans=t.num; level=t.level; } else if(level==t.level){ if(ans>t.num){ level=t.level; ans=t.num; } } int num=t.num; for(int i=0;i<G[num].size();i++){ if(vis[G[num][i]]==0){ vis[G[num][i]]=1; p.num=G[num][i]; p.level=t.level+1; q.push(p); } } } } int main(){ int a,b; scanf("%d%d%d",&N,&M,&K); memset(vis,0,sizeof(vis)); for(int i=0;i<M;i++){ scanf("%d%d",&a,&b); G[a].push_back(b); G[b].push_back(a); } for(int i=0;i<K;i++){ scanf("%d",&pro[i]); } for(int i=0;i<K;i++){ bfs(pro[i]); printf("%d\n",ans); ans=0;level=0; memset(vis,0,sizeof(vis)); } return 0; }