110132024-06-04 14:56:06zsomborÚtvonalakcpp17Accepted 100/100958ms82068 KiB
#include <iostream>
#include <vector>
#include <stack>
using namespace std;

int n, m, q;
vector <vector <int>> g(2e5);

vector <int> p(2e5, 0);
vector <int> d(2e5, 0);
vector <int> l(2e5, 0);
vector <bool> cut(2e5, false);
stack <int> s;
vector <vector <int>> bcc;

int k;
vector <int> comp(2e5, -1);
vector <vector <int>> t(3e5);

vector <int> D(3e5, 0);
vector <vector <int>> up(3e5, vector <int>(20, 0));
vector <int> w(3e5, -1);
vector <int> wsum(3e5, 0);

void dfs(int x) {
	s.push(x);
	for (int i : g[x]) {
		if (p[x] == i) continue;
		if (p[i] && d[i] > d[x]) continue;
		if (p[i] && d[i] < d[x]) { l[x] = min(l[x], d[i]); continue; }

		p[i] = x;
		d[i] = l[i] = d[x] + 1;
		dfs(i);
		l[x] = min(l[x], l[i]);

		if (l[i] >= d[x]) {
			cut[x] = true;
			vector <int> v;
			v.push_back(x);
			while (v.back() != i) { v.push_back(s.top()); s.pop(); }
			bcc.push_back(v);
		}
	}
}

void dfs2(int x) {
	for (int i : t[x]) {
		if (up[x][0] == i) continue;
		D[i] = D[x] + 1;
		up[i][0] = x;
		wsum[i] = wsum[x] + w[i];
		dfs2(i);
	}
}

int lca(int a, int b) {
	if (D[a] < D[b]) swap(a, b);
	for (int j = 19; j >= 0; j--) {
		if (D[up[a][j]] >= D[b]) a = up[a][j];
	}
	if (a == b) return a;
	for (int j = 19; j >= 0; j--) {
		if (up[a][j] == up[b][j]) continue;
		a = up[a][j];
		b = up[b][j];
	}
	return up[a][0];
}

void solve() {
	int a, b, c, ans;
	cin >> a >> b;
	a = comp[a]; b = comp[b];
	c = lca(a, b);
	ans = wsum[a] + wsum[b] - 2 * wsum[c] + w[c] - 2;
	if (a >= bcc.size()) ans++;
	if (b >= bcc.size()) ans++;
	cout << ans << "\n";
}

int main() {
	cin >> n >> m >> q;
	int a, b;
	for (int i = 0; i < m; i++) {
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}

	p[1] = l[1] = -1;
	dfs(1);
	int cnt = 0;
	for (int i : g[1]) if (p[i] == 1) cnt++;
	if (cnt < 2) cut[1] = false;

	k = bcc.size();
	for (int i = 0; i < bcc.size(); i++) {
		for (int x : bcc[i]) {
			if (!cut[x]) { comp[x] = i; continue; }
			if (comp[x] == -1) comp[x] = k++;
			t[i].push_back(comp[x]);
			t[comp[x]].push_back(i);
		}
	}

	for (int i = 0; i < bcc.size(); i++) w[i] = bcc[i].size();
	wsum[0] = w[0];
	dfs2(0);
	for (int j = 1; j < 20; j++) {
		for (int i = 0; i < k; i++) {
			up[i][j] = up[up[i][j - 1]][j - 1];
		}
	}
	while (q--) solve();
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted52ms53988 KiB
2Accepted216ms58972 KiB
subtask215/15
3Accepted67ms54116 KiB
4Accepted56ms54116 KiB
5Accepted76ms55140 KiB
6Accepted67ms54612 KiB
7Accepted128ms56532 KiB
8Accepted221ms58876 KiB
subtask315/15
9Accepted65ms54116 KiB
10Accepted57ms54244 KiB
11Accepted78ms55140 KiB
12Accepted71ms55392 KiB
13Accepted186ms60820 KiB
14Accepted321ms67584 KiB
15Accepted754ms82068 KiB
subtask415/15
16Accepted59ms54152 KiB
17Accepted61ms54244 KiB
18Accepted68ms54712 KiB
19Accepted143ms56456 KiB
20Accepted215ms58908 KiB
subtask515/15
21Accepted54ms53988 KiB
22Accepted67ms53988 KiB
23Accepted67ms54264 KiB
24Accepted68ms54244 KiB
25Accepted56ms54116 KiB
26Accepted54ms54116 KiB
subtask640/40
27Accepted64ms54020 KiB
28Accepted252ms58972 KiB
29Accepted67ms54116 KiB
30Accepted56ms54116 KiB
31Accepted76ms55140 KiB
32Accepted67ms54612 KiB
33Accepted128ms56532 KiB
34Accepted221ms58876 KiB
35Accepted65ms54116 KiB
36Accepted57ms54244 KiB
37Accepted78ms55140 KiB
38Accepted71ms55392 KiB
39Accepted186ms60820 KiB
40Accepted321ms67584 KiB
41Accepted754ms82068 KiB
42Accepted59ms54152 KiB
43Accepted61ms54244 KiB
44Accepted68ms54712 KiB
45Accepted143ms56456 KiB
46Accepted215ms58908 KiB
47Accepted54ms53988 KiB
48Accepted67ms53988 KiB
49Accepted67ms54264 KiB
50Accepted68ms54244 KiB
51Accepted56ms54116 KiB
52Accepted54ms54116 KiB
53Accepted572ms81808 KiB
54Accepted68ms54372 KiB
55Accepted79ms55140 KiB
56Accepted114ms54628 KiB
57Accepted316ms56624 KiB
58Accepted175ms57056 KiB
59Accepted958ms82068 KiB
60Accepted684ms59224 KiB
61Accepted685ms59228 KiB
62Accepted683ms59208 KiB