1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
using ll = long long;
using ii = pair<int, int>;
constexpr int MX = 1e5+5;
int ans, D[2*MX];
vector<int> G[MX], H[2*MX];
int main() {
if (fopen("in", "r")) freopen("in", "r", stdin), freopen("out", "w", stdout);
cin.tie(0)->sync_with_stdio(0);
int T; cin >> T;
while (T--) {
int N, M; cin >> N >> M;
for (int u = 1; u <= N; ++u) G[u].clear();
for (int u = 1; u <= 2*N; ++u) H[u].clear();
for (int i = 0; i < M; ++i) {
int x, y; cin >> x >> y;
G[x].push_back(y), G[y].push_back(x);
H[x].push_back(y+N), H[y+N].push_back(x);
H[y].push_back(x+N), H[x+N].push_back(y);
}
for (int u = 1; u <= 2*N; ++u) D[u] = 1e9;
queue<int> q;
D[1] = 0, q.push(1);
while (q.size()) {
int u = q.front(); q.pop();
for (int v : H[u]) if (D[v] == 1e9)
D[v] = D[u]+1, q.push(v);
}
if (*max_element(D+1, D+2*N+1) == 1e9) {
cout << N-1 << '\n';
continue;
}
/*vector<ii> C;
C.emplace_back(0, 0);
for (int u = 1; u <= N; ++u) {
C.emplace_back(D[u], D[u+N]);
}*/
ans = 0;
map<ii, int> f;
map<ii, vector<int>> b;
for (int u = 1; u <= N; ++u) {
ii p(min(D[u], D[u+N]), max(D[u], D[u+N]));
++f[p], b[p].push_back(u);
}
map<ii, int> ea;
for (auto [p, c] : f) {
int pr = ea[ii(p.f-1, p.s+1)];
if (p.f+1 == p.s) {
if (p.f == 0) ans += (c+1)/2;
else if (f[ii(p.f-1, p.s-1)]) ans += max((c-pr)+(pr+1)/2, (c+1)/2);
else {
if (pr < c) ans += c-pr;
ans += (c+1)/2;
}
}
else {
ans += c;
if (p.f == 0) ea[p] = c;
else if (f[ii(p.f-1, p.s-1)]) ea[p] += min(c, pr);
else {
if (pr < c) ans += c-pr;
ea[p] = c;
}
}
}
cout << ans << '\n';
}
}
|