110102024-06-04 13:56:45zsomborÚtvonalakcpp17Hibás válasz 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

*/
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva52ms53988 KiB
2Hibás válasz225ms58724 KiB
subtask20/15
3Hibás válasz64ms54044 KiB
4Hibás válasz65ms54108 KiB
5Elfogadva76ms55140 KiB
6Hibás válasz76ms54500 KiB
7Hibás válasz137ms56488 KiB
8Hibás válasz212ms58876 KiB
subtask315/15
9Elfogadva65ms54288 KiB
10Elfogadva68ms54372 KiB
11Elfogadva68ms55184 KiB
12Elfogadva81ms55500 KiB
13Elfogadva185ms60824 KiB
14Elfogadva328ms67604 KiB
15Elfogadva736ms82112 KiB
subtask40/15
16Hibás válasz59ms54116 KiB
17Hibás válasz65ms54376 KiB
18Hibás válasz79ms54644 KiB
19Hibás válasz148ms56456 KiB
20Hibás válasz221ms58716 KiB
subtask50/15
21Hibás válasz64ms54024 KiB
22Hibás válasz54ms54124 KiB
23Elfogadva56ms54244 KiB
24Hibás válasz64ms54248 KiB
25Hibás válasz57ms54116 KiB
26Hibás válasz54ms54116 KiB
subtask60/40
27Elfogadva54ms53988 KiB
28Hibás válasz268ms58724 KiB
29Hibás válasz64ms54044 KiB
30Hibás válasz65ms54108 KiB
31Elfogadva76ms55140 KiB
32Hibás válasz76ms54500 KiB
33Hibás válasz137ms56488 KiB
34Hibás válasz212ms58876 KiB
35Elfogadva65ms54288 KiB
36Elfogadva68ms54372 KiB
37Elfogadva68ms55184 KiB
38Elfogadva81ms55500 KiB
39Elfogadva185ms60824 KiB
40Elfogadva328ms67604 KiB
41Elfogadva736ms82112 KiB
42Hibás válasz59ms54116 KiB
43Hibás válasz65ms54376 KiB
44Hibás válasz79ms54644 KiB
45Hibás válasz148ms56456 KiB
46Hibás válasz221ms58716 KiB
47Hibás válasz64ms54024 KiB
48Hibás válasz54ms54124 KiB
49Elfogadva56ms54244 KiB
50Hibás válasz64ms54248 KiB
51Hibás válasz57ms54116 KiB
52Hibás válasz54ms54116 KiB
53Elfogadva598ms81796 KiB
54Hibás válasz59ms54116 KiB
55Elfogadva70ms55140 KiB
56Hibás válasz108ms54628 KiB
57Hibás válasz305ms56640 KiB
58Hibás válasz171ms56928 KiB
59Elfogadva944ms81896 KiB
60Hibás válasz700ms59204 KiB
61Hibás válasz703ms59324 KiB
62Hibás válasz702ms59288 KiB