110102024-06-04 13:56:45zsomborÚtvonalakcpp17Wrong answer 15/100944ms82112 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;
			while (l[s.top()] >= d[x] && s.top() != x) { v.push_back(s.top()); s.pop(); }
			v.push_back(x);
			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);
	//cout << a << " " << b << " " << c << endl;
	//cout << wsum[a] << " " << wsum[b] << " " << wsum[c] << "\n";
	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;

	/*cout << "\n";
	for (int i = 1; i <= n; i++) if (cut[i]) cout << i << " ";
	cout << "\n\n";
	for (auto v : bcc) {
		for (int i : v) cout << i << " ";
		cout << "\n";
	}
	cout << "\n";*/

	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();
}

/*

10 13 5
1 8
1 10
10 9
9 8
8 10
8 6
8 7
7 5
6 5
5 4
6 3
3 2
2 6
8 10
1 7
4 5
6 4
7 8

3 3 1
1 2
2 3
1 3
1 2

*/
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted52ms53988 KiB
2Wrong answer225ms58724 KiB
subtask20/15
3Wrong answer64ms54044 KiB
4Wrong answer65ms54108 KiB
5Accepted76ms55140 KiB
6Wrong answer76ms54500 KiB
7Wrong answer137ms56488 KiB
8Wrong answer212ms58876 KiB
subtask315/15
9Accepted65ms54288 KiB
10Accepted68ms54372 KiB
11Accepted68ms55184 KiB
12Accepted81ms55500 KiB
13Accepted185ms60824 KiB
14Accepted328ms67604 KiB
15Accepted736ms82112 KiB
subtask40/15
16Wrong answer59ms54116 KiB
17Wrong answer65ms54376 KiB
18Wrong answer79ms54644 KiB
19Wrong answer148ms56456 KiB
20Wrong answer221ms58716 KiB
subtask50/15
21Wrong answer64ms54024 KiB
22Wrong answer54ms54124 KiB
23Accepted56ms54244 KiB
24Wrong answer64ms54248 KiB
25Wrong answer57ms54116 KiB
26Wrong answer54ms54116 KiB
subtask60/40
27Accepted54ms53988 KiB
28Wrong answer268ms58724 KiB
29Wrong answer64ms54044 KiB
30Wrong answer65ms54108 KiB
31Accepted76ms55140 KiB
32Wrong answer76ms54500 KiB
33Wrong answer137ms56488 KiB
34Wrong answer212ms58876 KiB
35Accepted65ms54288 KiB
36Accepted68ms54372 KiB
37Accepted68ms55184 KiB
38Accepted81ms55500 KiB
39Accepted185ms60824 KiB
40Accepted328ms67604 KiB
41Accepted736ms82112 KiB
42Wrong answer59ms54116 KiB
43Wrong answer65ms54376 KiB
44Wrong answer79ms54644 KiB
45Wrong answer148ms56456 KiB
46Wrong answer221ms58716 KiB
47Wrong answer64ms54024 KiB
48Wrong answer54ms54124 KiB
49Accepted56ms54244 KiB
50Wrong answer64ms54248 KiB
51Wrong answer57ms54116 KiB
52Wrong answer54ms54116 KiB
53Accepted598ms81796 KiB
54Wrong answer59ms54116 KiB
55Accepted70ms55140 KiB
56Wrong answer108ms54628 KiB
57Wrong answer305ms56640 KiB
58Wrong answer171ms56928 KiB
59Accepted944ms81896 KiB
60Wrong answer700ms59204 KiB
61Wrong answer703ms59324 KiB
62Wrong answer702ms59288 KiB