被改进的点入队列继续改进其他点,直到没有点被改进
#include <bits/stdc++.h>
using namespace std;
#define INF 0x7fffffff
vector<int> adj[200005];
int n,m,dis[200005];
void spfa(int st){
queue<int> q;
q.push(st);
bool vis[200005]={0};
dis[st]=0;
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=false;
for(int i=0;i<adj[now].size();++i){
int en=adj[now][i];
if(dis[en] > dis[now]+1){
dis[en]=dis[now]+1;
if(!vis[en]) {
vis[en]=true;
q.push(en);
}
}
}
}
}
int main()
{
//fileSet();
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
}
int k;
cin>>k;
for(int t=0;t<k;t++)
{
int a,b;
cin>>a>>b;
if(a==b){cout<<0<<endl;continue;}
for(int i=0;i<n;i++)dis[i]=INF;
spfa(a);
if(dis[b]==INF)cout<<"-1"<<endl;
else cout<<dis[b]-1<<endl;
}
}