代码如下:
#pragma warning(disable:4996)
#include<cstdlib>
#include<stdlib.h>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdbool.h>
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
const int MAXn = 1e4 + 5;
const int MAXm = 5e4 + 5;
int read() {
int w = 0, r = 0; char ch = getchar();
while (ch < '0' || ch >'9')w |= ch == '-', ch = getchar();
while (ch >= '0' && ch <= '9')
r = (r << 1) + (r << 3) + (ch ^ 48), ch = getchar();
return w ? ~r + 1 : r;
}
int n, m, tot;
int head[MAXn], cnt;
struct Edge {
int u, v, next;
}ed[MAXm<<1];
void add(int u, int v) {
ed[cnt].u = u;
ed[cnt].v = v;
ed[cnt].next = head[u];
head[u] = cnt++;
return;
}
int dfn[MAXn], low[MAXn], id;
int col[MAXn], color, sta[MAXn], top;
bool vis[MAXn], bridge[MAXm<<1];
void Tarjan1(int x, int in_edge) {
dfn[x] = low[x] = ++id;
for (int i = head[x]; ~i; i = ed[i].next) {
int v = ed[i].v;
if (dfn[v] == 0) {
Tarjan1(v, i);
low[x] = min(low[x], low[v]);
if (low[v] >= dfn[x]) {
bridge[i] = bridge[i ^ 1] = true;
}
}
else if (i != (in_edge^1)) {
low[x] = min(low[x], dfn[v]);
}
}
}
void dfs(int x) {//染色
col[x] = color;
for (int i = head[x]; ~i; i = ed[i].next) {
int v = ed[i].v;
if (col[v] || bridge[i])continue;
dfs(v);
}
}
int hea2[MAXn], cn2;
int hea3[MAXn], cn3;
struct Edg {
int u, v, next, val;
}ed2[MAXm<<1], ed3[MAXm<<1];
void add2(int u, int v) {
ed2[++cn2].u = u;
ed2[cn2].v = v;
ed2[cn2].next = hea2[u];
hea2[u] = cn2;
}
void add3(int u, int v) {
ed3[cn3].u = u;
ed3[cn3].v = v;
ed3[cn3].next = hea3[u];
hea3[u] = cn3++;
}
int fa[MAXn];
int F(int x) {
return x == fa[x] ? x : fa[x] = F(fa[x]);
}
int dep[MAXn], lca[MAXn];
bool v2[MAXn];
void Tarjan2(int x, int f) {//初始化
v2[x] = true;
dep[x] = dep[f] + 1;
for (int i = hea2[x]; i; i = ed2[i].next) {
int v = ed2[i].v;
if (v2[v] == 0 && f != v) {
Tarjan2(v, x);
fa[v] = x;
}
}
for (int i = hea3[x]; ~i; i = ed3[i].next) {
int v = ed3[i].v, u = ed3[i].u;
if (v2[v] && ed3[i].val == 0) {
ed3[i].val = dep[u] + dep[v] - 2 * dep[F(v)] + 1;
//printf("TARJAN2 %d %d %d %d %d\n", i/2, dep[u], dep[v], dep[F(v)], ed3[i].val);
ed3[i ^ 1].val = ed3[i].val;
lca[i / 2] = fa[v];
}
}
}
void checkout() {
for (int i = 0; i < cnt; i++) {
printf("原边 %d %d\n", ed[i].u, ed[i].v);
}
for (int i = 1; i <= cn2; i++) {
printf("新边 %d %d\n", ed2[i].u, ed2[i].v);
}
for (int i = 0; i < cn3; i++) {
printf("询问 %d %d 颜色 %d %d\n", ed3[i].u, ed3[i].v, col[ed3[i].u], col[ed3[i].v]);
}
for (int i = 1; i <= n; i++) {
printf("颜色 i %d col %d\n", i, col[i]);
}
for (int i = 1; i <= n; i++) {
printf("深度 i %d dep %d\n", i, dep[i]);
}
for (int i = 0; i < cn3; i+=2) {
printf("询问祖先 %d lca %d %d\n", i, lca[i / 2], lca[(i ^ 1) / 2]);
}
}
void prin(int x) {
if (x == 0) {
putchar('0');
return;
}
else if (x == 1) {
putchar('1');
return;
}
prin(x >> 1);
char ch = x % 2 + 48;
putchar(ch);
return;
}
int main() {
n = read(); m = read();
memset(head, -1, sizeof head);
memset(hea3, -1, sizeof hea3);
for (int i = 1; i <= n; i++)fa[i] = i;
for (int i = 1; i <= m; i++) {
int p1 = read(), p2 = read();
add(p1, p2);
add(p2, p1);
}
//tot = read();
//for (int i = 1; i <= tot; i++) {
// int p1 = read(), p2 = read();
// add3(p1, p2);
// add3(p2, p1);
//}
for (int i = 1; i <= n; i++) {
if (dfn[i] == 0)Tarjan1(i, -1);//这个零 真有意思
}
for (int i = 1; i <= n; i++) {
if (col[i] == 0) {
++color;
dfs(i);
}
}
for (int i = 0; i < cnt; i+=2) {
int u = ed[i].u, v = ed[i].v;
if (col[u] != col[v]) {
add2(col[u], col[v]);
add2(col[v], col[u]);
}
}
tot = read();
for (int i = 1; i <= tot; i++) {
int p1 = read(), p2 = read();
add3(col[p1], col[p2]);
add3(col[p2], col[p1]);
}
//dep[1] = 1;
Tarjan2(1, 1);
//checkout();
//for (int i = 0; i < tot; i++) {
// char ch[35];
// itoa(ed3[2*i].val, ch, 2);
//printf("%s\n", ch);
//}
for (int i = 0; i < tot; i++) {
prin(ed3[2 * i].val);
putchar('\n');
}
return 0;
}