110132024-06-04 14:56:06zsomborÚtvonalakcpp17Elfogadva 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();
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva52ms53988 KiB
2Elfogadva216ms58972 KiB
subtask215/15
3Elfogadva67ms54116 KiB
4Elfogadva56ms54116 KiB
5Elfogadva76ms55140 KiB
6Elfogadva67ms54612 KiB
7Elfogadva128ms56532 KiB
8Elfogadva221ms58876 KiB
subtask315/15
9Elfogadva65ms54116 KiB
10Elfogadva57ms54244 KiB
11Elfogadva78ms55140 KiB
12Elfogadva71ms55392 KiB
13Elfogadva186ms60820 KiB
14Elfogadva321ms67584 KiB
15Elfogadva754ms82068 KiB
subtask415/15
16Elfogadva59ms54152 KiB
17Elfogadva61ms54244 KiB
18Elfogadva68ms54712 KiB
19Elfogadva143ms56456 KiB
20Elfogadva215ms58908 KiB
subtask515/15
21Elfogadva54ms53988 KiB
22Elfogadva67ms53988 KiB
23Elfogadva67ms54264 KiB
24Elfogadva68ms54244 KiB
25Elfogadva56ms54116 KiB
26Elfogadva54ms54116 KiB
subtask640/40
27Elfogadva64ms54020 KiB
28Elfogadva252ms58972 KiB
29Elfogadva67ms54116 KiB
30Elfogadva56ms54116 KiB
31Elfogadva76ms55140 KiB
32Elfogadva67ms54612 KiB
33Elfogadva128ms56532 KiB
34Elfogadva221ms58876 KiB
35Elfogadva65ms54116 KiB
36Elfogadva57ms54244 KiB
37Elfogadva78ms55140 KiB
38Elfogadva71ms55392 KiB
39Elfogadva186ms60820 KiB
40Elfogadva321ms67584 KiB
41Elfogadva754ms82068 KiB
42Elfogadva59ms54152 KiB
43Elfogadva61ms54244 KiB
44Elfogadva68ms54712 KiB
45Elfogadva143ms56456 KiB
46Elfogadva215ms58908 KiB
47Elfogadva54ms53988 KiB
48Elfogadva67ms53988 KiB
49Elfogadva67ms54264 KiB
50Elfogadva68ms54244 KiB
51Elfogadva56ms54116 KiB
52Elfogadva54ms54116 KiB
53Elfogadva572ms81808 KiB
54Elfogadva68ms54372 KiB
55Elfogadva79ms55140 KiB
56Elfogadva114ms54628 KiB
57Elfogadva316ms56624 KiB
58Elfogadva175ms57056 KiB
59Elfogadva958ms82068 KiB
60Elfogadva684ms59224 KiB
61Elfogadva685ms59228 KiB
62Elfogadva683ms59208 KiB