110122024-06-04 14:48:42zsomborÚtvonalakcpp17Accepted 100/100889ms82064 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);
	if (a != c && a >= bcc.size()) a = up[a][0];
	if (b != c && b >= bcc.size()) b = up[b][0];
	ans = wsum[a] + wsum[b] - 2 * wsum[c] + w[c] - 2;
	if (c >= bcc.size() && (a == c || b == c)) 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
3Accepted54ms54112 KiB
4Accepted56ms54300 KiB
5Accepted76ms55164 KiB
6Accepted75ms54504 KiB
7Accepted120ms56544 KiB
8Accepted202ms58748 KiB
subtask315/15
9Accepted57ms54060 KiB
10Accepted67ms54652 KiB
11Accepted65ms55268 KiB
12Accepted81ms55364 KiB
13Accepted186ms60696 KiB
14Accepted296ms67604 KiB
15Accepted748ms81984 KiB
subtask415/15
16Accepted59ms54116 KiB
17Accepted71ms54408 KiB
18Accepted78ms54544 KiB
19Accepted135ms56580 KiB
20Accepted214ms58844 KiB
subtask515/15
21Accepted65ms54168 KiB
22Accepted57ms54132 KiB
23Accepted57ms54280 KiB
24Accepted65ms54116 KiB
25Accepted61ms54116 KiB
26Accepted54ms54116 KiB
subtask640/40
27Accepted52ms54024 KiB
28Accepted238ms59044 KiB
29Accepted54ms54112 KiB
30Accepted56ms54300 KiB
31Accepted76ms55164 KiB
32Accepted75ms54504 KiB
33Accepted120ms56544 KiB
34Accepted202ms58748 KiB
35Accepted57ms54060 KiB
36Accepted67ms54652 KiB
37Accepted65ms55268 KiB
38Accepted81ms55364 KiB
39Accepted186ms60696 KiB
40Accepted296ms67604 KiB
41Accepted748ms81984 KiB
42Accepted59ms54116 KiB
43Accepted71ms54408 KiB
44Accepted78ms54544 KiB
45Accepted135ms56580 KiB
46Accepted214ms58844 KiB
47Accepted65ms54168 KiB
48Accepted57ms54132 KiB
49Accepted57ms54280 KiB
50Accepted65ms54116 KiB
51Accepted61ms54116 KiB
52Accepted54ms54116 KiB
53Accepted561ms81808 KiB
54Accepted59ms54392 KiB
55Accepted79ms55288 KiB
56Accepted101ms54636 KiB
57Accepted314ms56624 KiB
58Accepted177ms57060 KiB
59Accepted889ms82064 KiB
60Accepted694ms59064 KiB
61Accepted716ms59316 KiB
62Accepted669ms59208 KiB