比赛 |
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 ;
}