@@ -8,32 +8,25 @@ int main() {
88 int n, m;
99 cin >> n >> m;
1010 vector<basic_string<int >> adj (n);
11- vector<basic_string<array<int , 2 >>> adj_e_id (n);
12- for (int i = 0 ; i < n; i++) {
13- adj[i] += i;
14- adj_e_id[i] += {i, i};
15- }
11+ for (int i = 0 ; i < n; i++) adj[i] += i;
12+ vector<array<int , 2 >> edges (m);
1613 for (int i = 0 ; i < m; i++) {
1714 int u, v;
1815 cin >> u >> v;
1916 adj[u] += v;
2017 adj[v] += u;
21- adj_e_id[u] += {v, n + i} ;
22- adj_e_id[v] + = {u, n + i };
18+ if (u > v) swap (u, v) ;
19+ edges[i] = {u, v };
2320 }
2421 UF uf (n);
25- vector<bool > seen (n + m);
22+ ranges::sort (edges);
23+ for (int i = 1 ; i < m; i++)
24+ if (edges[i - 1 ] == edges[i])
25+ uf.join (edges[i][0 ], edges[i][1 ]);
2626 bcc_callback (adj, [&](const vi& nodes) {
2727 assert (sz (nodes) >= 2 );
28- int cnt_edges = 0 ;
29- rep (i, 0 , sz (nodes) - 1 ) for (auto [v, e_id] :
30- adj_e_id[nodes[i]]) if (!seen[e_id] &&
31- v != nodes[i]) {
32- seen[e_id] = 1 ;
33- cnt_edges++;
34- }
35- if (cnt_edges >= 2 )
36- for (int v : nodes) uf.join (v, nodes[0 ]);
28+ if (sz (nodes) == 2 ) return ;
29+ for (int v : nodes) uf.join (v, nodes[0 ]);
3730 });
3831 vector<basic_string<int >> two_edge_ccs (n);
3932 rep (i, 0 , n) two_edge_ccs[uf.find (i)] += i;
0 commit comments