比赛 test2 评测结果 AAAAAAAAAA
题目名称 Geodetic 集合 最终得分 100
用户昵称 HeHe 运行时间 0.020 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2017-03-12 20:01:41
显示代码纯文本
//\
1252.Geodetic_集合  \
g++ 1252.Geodetic_集合_1.cpp -O2 -g -D LOCAL -D debug

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;

#define is_num(tmp) (tmp<='9' and tmp>='0')

inline int in(void){
	char tmp=getchar();
	int res=0, f=1;
	
	while(!(is_num(tmp)||tmp=='-'))tmp=getchar();
	if(tmp=='-')f=-1, tmp=getchar();
	while(is_num(tmp))
		res=(res<<1)+(res<<3)+(tmp^48),
		tmp=getchar();
	return res*f;
}

void bfs(int, int);

int N, M, Q, a, b;
int dis[50][50], cnt;
int dis2[50], pre[50];
bool visit[50], map[50][50];

int main(){
#ifndef LOCAL
	freopen("geo.in", "r", stdin);
	freopen("geo.out", "w", stdout);
#endif

	memset(dis, 127/3, sizeof(dis));
	N=in(), M=in();
	for(int i=1; i<=N; ++i)dis[i][i]=0;
	for(int i=1; i<=M; ++i){
		a=in(), b=in();
		dis[a][b]=dis[b][a]=1;
		map[a][b]=map[b][a]=true;
	}

	for(int k=1; k<=N; ++k){
		for(int i=1; i<=N; ++i){
			for(int j=1; j<=N; ++j){
				dis[i][j]=min(dis[i][j], dis[i][k]+dis[k][j]);
			}
		}
	}

	Q=in();
	for(int i=1; i<=Q; ++i){
		a=in(), b=in();
		bfs(a, b);
	}
	return 0;
}

void bfs(int sta, int end){
	queue<int>que;
	vector<int>ans;
	memset(visit, 0, sizeof(visit));
	
	
	que.push(sta);
	visit[sta]=1, visit[end]=1;
	ans.push_back(sta), ans.push_back(end);
	
	while(!que.empty()){
		int now=que.front();
		que.pop();
		
		for(int i=1; i<=N; ++i){
			if(map[now][i]){
				if(dis[i][end]==dis[now][end]-1 && i!=end && !visit[i]){
					que.push(i);
					visit[i]=1;
					ans.push_back(i);
				}
			}
		}
	}
	
	sort(ans.begin(), ans.end());
	for(int i=0; i<ans.size(); ++i){
		printf("%d ",ans[i]);
	}
	putchar('\n');
	return ;
}