110052024-06-04 12:04:51zsomborÚtvonalakcpp17Hibás válasz 0/1001.103s81148 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);
			cout << i << " " << comp[x] << endl;
		}
	}

	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
1Hibás válasz63ms54016 KiB
2Hibás válasz228ms58752 KiB
subtask20/15
3Hibás válasz64ms54248 KiB
4Hibás válasz57ms54176 KiB
5Hibás válasz93ms55056 KiB
6Hibás válasz79ms54508 KiB
7Hibás válasz126ms56548 KiB
8Hibás válasz209ms58700 KiB
subtask30/15
9Hibás válasz70ms54244 KiB
10Hibás válasz64ms54388 KiB
11Hibás válasz90ms55140 KiB
12Hibás válasz120ms55584 KiB
13Hibás válasz441ms61876 KiB
14Hibás válasz782ms69556 KiB
15Időlimit túllépés1.098s78016 KiB
subtask40/15
16Hibás válasz59ms54320 KiB
17Hibás válasz65ms54244 KiB
18Hibás válasz75ms54500 KiB
19Hibás válasz148ms56480 KiB
20Hibás válasz241ms58780 KiB
subtask50/15
21Hibás válasz65ms53864 KiB
22Hibás válasz65ms53988 KiB
23Hibás válasz70ms54452 KiB
24Hibás válasz57ms54136 KiB
25Hibás válasz64ms53988 KiB
26Hibás válasz64ms54116 KiB
subtask60/40
27Hibás válasz63ms54120 KiB
28Hibás válasz256ms58768 KiB
29Hibás válasz64ms54248 KiB
30Hibás válasz57ms54176 KiB
31Hibás válasz93ms55056 KiB
32Hibás válasz79ms54508 KiB
33Hibás válasz126ms56548 KiB
34Hibás válasz209ms58700 KiB
35Hibás válasz70ms54244 KiB
36Hibás válasz64ms54388 KiB
37Hibás válasz90ms55140 KiB
38Hibás válasz120ms55584 KiB
39Hibás válasz441ms61876 KiB
40Hibás válasz782ms69556 KiB
41Időlimit túllépés1.098s78016 KiB
42Hibás válasz59ms54320 KiB
43Hibás válasz65ms54244 KiB
44Hibás válasz75ms54500 KiB
45Hibás válasz148ms56480 KiB
46Hibás válasz241ms58780 KiB
47Hibás válasz65ms53864 KiB
48Hibás válasz65ms53988 KiB
49Hibás válasz70ms54452 KiB
50Hibás válasz57ms54136 KiB
51Hibás válasz64ms53988 KiB
52Hibás válasz64ms54116 KiB
53Időlimit túllépés1.093s79484 KiB
54Hibás válasz59ms54244 KiB
55Hibás válasz107ms55212 KiB
56Hibás válasz116ms54628 KiB
57Hibás válasz347ms56640 KiB
58Hibás válasz196ms57076 KiB
59Időlimit túllépés1.103s81148 KiB
60Hibás válasz656ms59112 KiB
61Hibás válasz680ms59368 KiB
62Hibás válasz575ms59244 KiB