110062024-06-04 12:06:13zsomborÚtvonalakcpp17Hibás válasz 0/100681ms78992 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;
	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";
	cout << wsum[a] + wsum[b] - 2 * wsum[c] + 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
1Elfogadva54ms53988 KiB
2Hibás válasz243ms58768 KiB
subtask20/15
3Hibás válasz56ms54040 KiB
4Hibás válasz67ms54284 KiB
5Hibás válasz75ms55012 KiB
6Hibás válasz75ms54652 KiB
7Hibás válasz136ms56568 KiB
8Hibás válasz193ms58876 KiB
subtask30/15
9Hibás válasz56ms54116 KiB
10Hibás válasz67ms54288 KiB
11Hibás válasz67ms54884 KiB
12Hibás válasz81ms55392 KiB
13Hibás válasz172ms60868 KiB
14Hibás válasz358ms67648 KiB
15Hibás válasz666ms75544 KiB
subtask40/15
16Hibás válasz70ms54196 KiB
17Hibás válasz68ms54268 KiB
18Hibás válasz79ms54544 KiB
19Hibás válasz142ms56440 KiB
20Hibás válasz239ms58844 KiB
subtask50/15
21Hibás válasz67ms54048 KiB
22Hibás válasz65ms54024 KiB
23Hibás válasz68ms54244 KiB
24Hibás válasz57ms54032 KiB
25Hibás válasz65ms54116 KiB
26Hibás válasz64ms54116 KiB
subtask60/40
27Elfogadva54ms53988 KiB
28Hibás válasz287ms58788 KiB
29Hibás válasz56ms54040 KiB
30Hibás válasz67ms54284 KiB
31Hibás válasz75ms55012 KiB
32Hibás válasz75ms54652 KiB
33Hibás válasz136ms56568 KiB
34Hibás válasz193ms58876 KiB
35Hibás válasz56ms54116 KiB
36Hibás válasz67ms54288 KiB
37Hibás válasz67ms54884 KiB
38Hibás válasz81ms55392 KiB
39Hibás válasz172ms60868 KiB
40Hibás válasz358ms67648 KiB
41Hibás válasz666ms75544 KiB
42Hibás válasz70ms54196 KiB
43Hibás válasz68ms54268 KiB
44Hibás válasz79ms54544 KiB
45Hibás válasz142ms56440 KiB
46Hibás válasz239ms58844 KiB
47Hibás válasz67ms54048 KiB
48Hibás válasz65ms54024 KiB
49Hibás válasz68ms54244 KiB
50Hibás válasz57ms54032 KiB
51Hibás válasz65ms54116 KiB
52Hibás válasz64ms54116 KiB
53Hibás válasz485ms77040 KiB
54Hibás válasz70ms54176 KiB
55Hibás válasz68ms55012 KiB
56Hibás válasz111ms54540 KiB
57Hibás válasz312ms56640 KiB
58Hibás válasz194ms57000 KiB
59Hibás válasz670ms78992 KiB
60Hibás válasz681ms59188 KiB
61Hibás válasz661ms59252 KiB
62Hibás válasz672ms59244 KiB