#include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i=a; i<=b; ++i) #define pi pair<int, int> #define f first #define s second #define eb emplace_back #define pb push_back #define sz(A) (int)(A.size()) const int maxn=3e4+7; vector<int> conA[maxn], conB[maxn]; vector<pi> edgesA, edgesB; map<pi, bool> isA, isB; int n, ms, md; vector<pair<int, pi>> odp; bool vis[maxn]; void cadd(int a, int b) { odp.pb({1, {a, b}}); } void cremove(int a, int b) { odp.pb({-1, {a, b}}); } void dodaj_specjalne() { FOR(i, 2, n) { if(isA[{1, i}]) continue; if(isB[{1, i}]) conA[1].eb(i), conA[i].eb(1), isA[{1, i}]=1, isA[{i, 1}]=1, edgesA.pb({1, i}); cadd(1, i); } } void dodaj_wymagane() { for(auto &[a, b] : edgesB) { if(isA[{a, b}]) continue; isA[{a, b}]=isA[{b, a}]=1; conA[a].eb(b); conA[b].eb(a); edgesA.pb({a, b}); cadd(a, b); } } void usun_niepotrzebne() { for(auto &[a, b] : edgesA) { if(!isB[{a, b}] && min(a, b)==1) { isA[{a, b}]=isA[{b, a}]=0; continue; } if(isB[{a, b}] || min(a, b)==1) continue; isA[{a, b}]=isA[{b, a}]=0; cremove(a, b); } } void napraw_graf() { FOR(i, 1, n) { int j = 0; while(j<=sz(conA[i])-1) { int v = conA[i][j]; if(isA[{i, v}]==0) { swap(conA[i][j], conA[i].back()); conA[i].pop_back(); --j; } ++j; } } } void dfs(int v) { vis[v]=1; for(int u : conA[v]) { if(vis[u]) continue; dfs(u); } if(isB[{1, v}] || v==1) return; cremove(1, v); } void usun_specjalne() { dfs(1); } int main() { cin.tie(0) -> ios_base::sync_with_stdio(0); cin >> n; cin >> ms; int a, b; FOR(i, 1, ms) { cin >> a >> b; conA[a].eb(b); conA[b].eb(a); isA[{a, b}]=isA[{b, a}]=1; edgesA.pb({a, b}); } cin >> md; FOR(i, 1, md) { cin >> a >> b; conB[a].eb(b); conB[b].eb(a); isB[{a, b}]=isB[{b, a}]=1; edgesB.pb({a, b}); } dodaj_specjalne(); dodaj_wymagane(); usun_niepotrzebne(); napraw_graf(); usun_specjalne(); cout << sz(odp) << '\n'; for(auto &[typ, nodes] : odp) { if(typ==1) cout << "+ "; if(typ==-1) cout << "- "; cout << nodes.f << ' ' << nodes.s << '\n'; } }
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include <bits/stdc++.h> using namespace std; #define FOR(i, a, b) for(int i=a; i<=b; ++i) #define pi pair<int, int> #define f first #define s second #define eb emplace_back #define pb push_back #define sz(A) (int)(A.size()) const int maxn=3e4+7; vector<int> conA[maxn], conB[maxn]; vector<pi> edgesA, edgesB; map<pi, bool> isA, isB; int n, ms, md; vector<pair<int, pi>> odp; bool vis[maxn]; void cadd(int a, int b) { odp.pb({1, {a, b}}); } void cremove(int a, int b) { odp.pb({-1, {a, b}}); } void dodaj_specjalne() { FOR(i, 2, n) { if(isA[{1, i}]) continue; if(isB[{1, i}]) conA[1].eb(i), conA[i].eb(1), isA[{1, i}]=1, isA[{i, 1}]=1, edgesA.pb({1, i}); cadd(1, i); } } void dodaj_wymagane() { for(auto &[a, b] : edgesB) { if(isA[{a, b}]) continue; isA[{a, b}]=isA[{b, a}]=1; conA[a].eb(b); conA[b].eb(a); edgesA.pb({a, b}); cadd(a, b); } } void usun_niepotrzebne() { for(auto &[a, b] : edgesA) { if(!isB[{a, b}] && min(a, b)==1) { isA[{a, b}]=isA[{b, a}]=0; continue; } if(isB[{a, b}] || min(a, b)==1) continue; isA[{a, b}]=isA[{b, a}]=0; cremove(a, b); } } void napraw_graf() { FOR(i, 1, n) { int j = 0; while(j<=sz(conA[i])-1) { int v = conA[i][j]; if(isA[{i, v}]==0) { swap(conA[i][j], conA[i].back()); conA[i].pop_back(); --j; } ++j; } } } void dfs(int v) { vis[v]=1; for(int u : conA[v]) { if(vis[u]) continue; dfs(u); } if(isB[{1, v}] || v==1) return; cremove(1, v); } void usun_specjalne() { dfs(1); } int main() { cin.tie(0) -> ios_base::sync_with_stdio(0); cin >> n; cin >> ms; int a, b; FOR(i, 1, ms) { cin >> a >> b; conA[a].eb(b); conA[b].eb(a); isA[{a, b}]=isA[{b, a}]=1; edgesA.pb({a, b}); } cin >> md; FOR(i, 1, md) { cin >> a >> b; conB[a].eb(b); conB[b].eb(a); isB[{a, b}]=isB[{b, a}]=1; edgesB.pb({a, b}); } dodaj_specjalne(); dodaj_wymagane(); usun_niepotrzebne(); napraw_graf(); usun_specjalne(); cout << sz(odp) << '\n'; for(auto &[typ, nodes] : odp) { if(typ==1) cout << "+ "; if(typ==-1) cout << "- "; cout << nodes.f << ' ' << nodes.s << '\n'; } } |