110142024-06-04 14:57:27zsomborÚtvonalakcpp17Accepted 100/100449ms82068 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() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	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
1Accepted63ms54052 KiB
2Accepted138ms58972 KiB
subtask215/15
3Accepted54ms54196 KiB
4Accepted56ms54116 KiB
5Accepted74ms55140 KiB
6Accepted70ms54500 KiB
7Accepted90ms56544 KiB
8Accepted140ms58740 KiB
subtask315/15
9Accepted54ms54064 KiB
10Accepted65ms54248 KiB
11Accepted63ms55272 KiB
12Accepted75ms55480 KiB
13Accepted118ms60820 KiB
14Accepted264ms67604 KiB
15Accepted449ms82068 KiB
subtask415/15
16Accepted61ms54268 KiB
17Accepted61ms54428 KiB
18Accepted64ms54776 KiB
19Accepted87ms56580 KiB
20Accepted136ms58992 KiB
subtask515/15
21Accepted65ms54116 KiB
22Accepted54ms54120 KiB
23Accepted67ms54308 KiB
24Accepted65ms54124 KiB
25Accepted61ms54244 KiB
26Accepted64ms54120 KiB
subtask640/40
27Accepted64ms54032 KiB
28Accepted128ms59136 KiB
29Accepted54ms54196 KiB
30Accepted56ms54116 KiB
31Accepted74ms55140 KiB
32Accepted70ms54500 KiB
33Accepted90ms56544 KiB
34Accepted140ms58740 KiB
35Accepted54ms54064 KiB
36Accepted65ms54248 KiB
37Accepted63ms55272 KiB
38Accepted75ms55480 KiB
39Accepted118ms60820 KiB
40Accepted264ms67604 KiB
41Accepted449ms82068 KiB
42Accepted61ms54268 KiB
43Accepted61ms54428 KiB
44Accepted64ms54776 KiB
45Accepted87ms56580 KiB
46Accepted136ms58992 KiB
47Accepted65ms54116 KiB
48Accepted54ms54120 KiB
49Accepted67ms54308 KiB
50Accepted65ms54124 KiB
51Accepted61ms54244 KiB
52Accepted64ms54120 KiB
53Accepted407ms81768 KiB
54Accepted71ms54256 KiB
55Accepted64ms55012 KiB
56Accepted79ms54628 KiB
57Accepted126ms56776 KiB
58Accepted101ms57076 KiB
59Accepted439ms82068 KiB
60Accepted189ms59352 KiB
61Accepted188ms59312 KiB
62Accepted181ms59332 KiB