传送门(洛谷)
数据范围:n<=40,故先用 f l o y d floyd floyd跑一遍,然后遍历每一个点(相当于一个中转点),如果起点到这个中转点的距离加上中转点到终点的距离和等于起点到终点的距离,则这个点就是 G e o d e t i c Geodetic Geodetic集合的一个元素
#include<bits/stdc++.h>
#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)
#define don(i,a,b) for(register int (i)=(a);(i)>=(b);(i)--)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e3+10;
int n,m,s,cnt,k;
int head[maxn],f[maxm][maxm];
template <class t> inline void read(t &x)
{
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=10*x+ch-'0';ch=getchar();}
x*=f;
}
void readdata()
{
memset(f,10,sizeof(f));
read(n);read(m);
rep(i,1,m) {
int x,y;
read(x),read(y);
f[x][y]=f[y][x]=1;
}
}
void Floyd() {
rep(k,1,n)
rep(j,1,n)
rep(i,1,n) {
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
void work()
{
read(s);
rep(i,1,n) f[i][i]=0;
Floyd();
rep(i,1,s) {
int x,y;
read(x),read(y);
rep(j,1,n) {
if(f[x][y]==f[x][j]+f[j][y])
printf("%d ",j);
}
printf("\n");
}
}
int main()
{
//freopen("input.txt","r",stdin);
readdata();
work();
return 0;
}