110072024-06-04 12:17:22zsomborÚtvonalakcpp17Hibás válasz 0/100703ms78952 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, -1);

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]) { 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);
	ans = wsum[a] + wsum[b] - 2 * wsum[c] + abs(w[c]) - 2;
	//cout << a << " " << b << " " << c << endl;
	//cout << wsum[a] << " " << wsum[b] << " " << wsum[c] << "\n";
	cout << wsum[a] + wsum[b] - 2 * wsum[c] + abs(w[c]) - 2 << "\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 4
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

*/
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva52ms53988 KiB
2Hibás válasz223ms58728 KiB
subtask20/15
3Hibás válasz54ms53956 KiB
4Hibás válasz56ms54096 KiB
5Hibás válasz63ms54996 KiB
6Hibás válasz65ms54616 KiB
7Hibás válasz122ms56288 KiB
8Hibás válasz190ms58876 KiB
subtask30/15
9Hibás válasz56ms54288 KiB
10Hibás válasz68ms54308 KiB
11Hibás válasz65ms55164 KiB
12Hibás válasz81ms55368 KiB
13Hibás válasz178ms60696 KiB
14Hibás válasz286ms67600 KiB
15Hibás válasz638ms75584 KiB
subtask40/15
16Hibás válasz59ms54116 KiB
17Hibás válasz78ms54392 KiB
18Hibás válasz79ms54652 KiB
19Hibás válasz135ms56472 KiB
20Hibás válasz225ms58844 KiB
subtask50/15
21Hibás válasz68ms54120 KiB
22Hibás válasz68ms54084 KiB
23Hibás válasz70ms54280 KiB
24Hibás válasz57ms54116 KiB
25Hibás válasz56ms54116 KiB
26Hibás válasz56ms54116 KiB
subtask60/40
27Elfogadva54ms53988 KiB
28Hibás válasz277ms58808 KiB
29Hibás válasz54ms53956 KiB
30Hibás válasz56ms54096 KiB
31Hibás válasz63ms54996 KiB
32Hibás válasz65ms54616 KiB
33Hibás válasz122ms56288 KiB
34Hibás válasz190ms58876 KiB
35Hibás válasz56ms54288 KiB
36Hibás válasz68ms54308 KiB
37Hibás válasz65ms55164 KiB
38Hibás válasz81ms55368 KiB
39Hibás válasz178ms60696 KiB
40Hibás válasz286ms67600 KiB
41Hibás válasz638ms75584 KiB
42Hibás válasz59ms54116 KiB
43Hibás válasz78ms54392 KiB
44Hibás válasz79ms54652 KiB
45Hibás válasz135ms56472 KiB
46Hibás válasz225ms58844 KiB
47Hibás válasz68ms54120 KiB
48Hibás válasz68ms54084 KiB
49Hibás válasz70ms54280 KiB
50Hibás válasz57ms54116 KiB
51Hibás válasz56ms54116 KiB
52Hibás válasz56ms54116 KiB
53Hibás válasz584ms77008 KiB
54Hibás válasz70ms54160 KiB
55Hibás válasz67ms55012 KiB
56Hibás válasz98ms54756 KiB
57Hibás válasz361ms56628 KiB
58Hibás válasz181ms56928 KiB
59Hibás válasz648ms78952 KiB
60Hibás válasz660ms59228 KiB
61Hibás válasz703ms59324 KiB
62Hibás válasz695ms59244 KiB