不要被数据范围吓到……
链表+简单的bfs。不喜欢用链表所以写了vector。
/*
* Author: stormdpzh
* Created Time: 2012/7/11 22:19:27
* File Name: woj_1006.cpp
*/
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>
#define sz(v) ((int)(v).size())
#define rep(i, n) for(int i = 0; i < n; i++)
#define repf(i, a, b) for(int i = a; i <= b; i++)
#define repd(i, a, b) for(int i = a; i >= b; i--)
#define out(n) printf("%d\n", n)
#define mset(a, b) memset(a, b, sizeof(a))
#define wh(n) while(1 == scanf("%d", &n))
#define whz(n) while(1 == scanf("%d", &n) && n != 0)
#define lint long long
using namespace std;
const int MaxN = 200005;
vector<int> vec[MaxN];
bool visited[MaxN];
int n, m, k;
struct Node {
int a, l;
Node(int _a, int _l) : a(_a), l(_l) {}
};
void init()
{
rep(i, n) vec[i].clear();
rep(i, m) {
int a, b;
scanf("%d%d", &a, &b);
vec[a].push_back(b);
vec[b].push_back(a);
}
scanf("%d", &k);
}
int gao(int s, int e)
{
mset(visited, false);
visited[s] = true;
queue<Node> que;
que.push(Node(s, 0));
while(!que.empty()) {
Node tmp = que.front();
que.pop();
if(tmp.a == e) {
if(tmp.l >= 1) return tmp.l - 1;
return tmp.l;
}
for(vector<int>::iterator it = vec[tmp.a].begin(); it != vec[tmp.a].end(); it++) {
if(!visited[*it]) {
visited[*it] = true;
que.push(Node(*it, tmp.l + 1));
}
}
}
return -1;
}
int main()
{
while(2 == scanf("%d%d", &n, &m)) {
init();
rep(i, k) {
int a, b;
scanf("%d%d", &a, &b);
out(gao(a, b));
}
}
return 0;
}