1+ #pragma GCC optimize("Ofast")
2+ #pragma GCC optimize("unroll-loops")
3+ #include < bits/stdc++.h>
4+ using namespace std ;
5+
6+ int n, e, e2 ;
7+ vector<vector<int >> adjlist;
8+ vector<vector<int >> adjlistg;
9+ vector<int > colour;
10+
11+ void dfs (int u, int col){
12+ colour[u] = col;
13+ for (int v : adjlistg[u]){
14+ if (colour[v] == -1 ){
15+ dfs (v, col);
16+ }
17+ }
18+ }
19+
20+ vector<int > colour2;
21+ void dfs2 (int u, int col){
22+ colour2[u] = col;
23+ for (int v : adjlist[u]){
24+ if (colour2[v] == -1 ){
25+ dfs2 (v, col);
26+ }
27+ }
28+ }
29+
30+ int main (){
31+ int tc;
32+ cin >> tc;
33+ while (tc--){
34+ cin >> n >> e >> e2 ;
35+ adjlist.assign (n, vector<int >());
36+ adjlistg.assign (n, vector<int >());
37+ colour.assign (n, -1 );
38+
39+ vector<pair<int , int >> el (e);
40+ for (int i=0 ; i<e; i++){
41+ int a, b;
42+ cin >> a >> b;
43+ a--; b--;
44+ el[i] = {a, b};
45+ }
46+
47+ for (int i=0 ; i<e2 ; i++){
48+ int a, b;
49+ cin >> a >> b;
50+ a--; b--;
51+ adjlistg[a].push_back (b);
52+ adjlistg[b].push_back (a);
53+ }
54+
55+
56+ // colour nodes based on G
57+ int col = 0 ;
58+ for (int i=0 ; i<n; i++){
59+ if (colour[i] == -1 ){
60+ dfs (i, col);
61+ col++;
62+ }
63+ }
64+
65+ // remove edges across colours in F
66+ // vector<pair<int, int>> reducedel;
67+ int ans = 0 ;
68+ for (auto [a, b] : el){
69+ if (colour[a] == colour[b]){
70+ adjlist[a].push_back (b);
71+ adjlist[b].push_back (a);
72+ }
73+ else {
74+ ans++;
75+ }
76+ }
77+
78+ // colour nodes based on F
79+ colour2.assign (n, -1 );
80+ int col2 = 0 ;
81+ for (int i=0 ; i<n; i++){
82+ if (colour2[i] == -1 ){
83+ dfs2 (i, col2);
84+ col2++;
85+ }
86+ }
87+
88+ ans += col2 - col;
89+ cout << ans << endl;
90+ }
91+
92+ return 0 ;
93+ }
0 commit comments