110122024-06-04 14:48:42zsomborÚtvonalakcpp17Elfogadva 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();
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva52ms53988 KiB
2Elfogadva216ms58972 KiB
subtask215/15
3Elfogadva54ms54112 KiB
4Elfogadva56ms54300 KiB
5Elfogadva76ms55164 KiB
6Elfogadva75ms54504 KiB
7Elfogadva120ms56544 KiB
8Elfogadva202ms58748 KiB
subtask315/15
9Elfogadva57ms54060 KiB
10Elfogadva67ms54652 KiB
11Elfogadva65ms55268 KiB
12Elfogadva81ms55364 KiB
13Elfogadva186ms60696 KiB
14Elfogadva296ms67604 KiB
15Elfogadva748ms81984 KiB
subtask415/15
16Elfogadva59ms54116 KiB
17Elfogadva71ms54408 KiB
18Elfogadva78ms54544 KiB
19Elfogadva135ms56580 KiB
20Elfogadva214ms58844 KiB
subtask515/15
21Elfogadva65ms54168 KiB
22Elfogadva57ms54132 KiB
23Elfogadva57ms54280 KiB
24Elfogadva65ms54116 KiB
25Elfogadva61ms54116 KiB
26Elfogadva54ms54116 KiB
subtask640/40
27Elfogadva52ms54024 KiB
28Elfogadva238ms59044 KiB
29Elfogadva54ms54112 KiB
30Elfogadva56ms54300 KiB
31Elfogadva76ms55164 KiB
32Elfogadva75ms54504 KiB
33Elfogadva120ms56544 KiB
34Elfogadva202ms58748 KiB
35Elfogadva57ms54060 KiB
36Elfogadva67ms54652 KiB
37Elfogadva65ms55268 KiB
38Elfogadva81ms55364 KiB
39Elfogadva186ms60696 KiB
40Elfogadva296ms67604 KiB
41Elfogadva748ms81984 KiB
42Elfogadva59ms54116 KiB
43Elfogadva71ms54408 KiB
44Elfogadva78ms54544 KiB
45Elfogadva135ms56580 KiB
46Elfogadva214ms58844 KiB
47Elfogadva65ms54168 KiB
48Elfogadva57ms54132 KiB
49Elfogadva57ms54280 KiB
50Elfogadva65ms54116 KiB
51Elfogadva61ms54116 KiB
52Elfogadva54ms54116 KiB
53Elfogadva561ms81808 KiB
54Elfogadva59ms54392 KiB
55Elfogadva79ms55288 KiB
56Elfogadva101ms54636 KiB
57Elfogadva314ms56624 KiB
58Elfogadva177ms57060 KiB
59Elfogadva889ms82064 KiB
60Elfogadva694ms59064 KiB
61Elfogadva716ms59316 KiB
62Elfogadva669ms59208 KiB