L3-008. 喊山 天梯初赛

#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;
}

猜你喜欢

转载自blog.csdn.net/chan_yeol/article/details/51606229