#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'; } } |
English