#include <bits/stdc++.h> using namespace std; #define fi first #define se second pair <int, int> para(int a, int b) { if(a < b) return {a, b}; return {b, a}; } void wczytaj(int &ile, vector <vector <int> > &kraw, set <pair <int, int> > &s) { cin >> ile; for(int i = 1; i <= ile; i++) { int a, b; cin >> a >> b; kraw[a].push_back(b); kraw[b].push_back(a); s.insert(para(a, b)); } } void dfs(int x, deque <int> &stos, vector <vector <int> > &kraw, vector <bool> &odw) { odw[x] = 1; stos.push_back(x); for(int v : kraw[x]) if(!odw[v]) dfs(v, stos, kraw, odw); } string nowy_string(int a, int b, bool dodaj) { string ret = ""; if(dodaj) ret += "+ "; else ret += "- "; ret += to_string(a); ret += " "; ret += to_string(b); return ret; } void krawedzie_ze_stosu(deque <int> &q, set <pair <int, int> > &s, queue <string> &odp, bool dodaj) { while(!q.empty()) { int x; if(dodaj) { x = q.front(); q.pop_front(); } else { x = q.back(); q.pop_back(); } if(x != 1 && s.find({1, x}) == s.end()) odp.push(nowy_string(1, x, dodaj)); } } void szukaj(set <pair <int, int> > &set1, set <pair <int, int> > &set2, queue <string> &odp, bool dodaj) { for(auto kraw : set1) { if(kraw.fi != 1 && kraw.se != 1 && set2.find(kraw) == set2.end()) odp.push(nowy_string(kraw.fi, kraw.se, dodaj)); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, ms, md; cin >> n; set <pair <int, int> > wyst_s; set <pair <int, int> > wyst_d; vector <vector <int> > kraw_s(n + 1); vector <vector <int> > kraw_d(n + 1); wczytaj(ms, kraw_s, wyst_s); wczytaj(md, kraw_d, wyst_d); deque <int> preorder_s; deque <int> preorder_d; vector <bool> odw_s(n + 1); vector <bool> odw_d(n + 1); dfs(1, preorder_s, kraw_s, odw_s); dfs(1, preorder_d, kraw_d, odw_d); queue <string> odp; krawedzie_ze_stosu(preorder_s, wyst_s, odp, 1); szukaj(wyst_d, wyst_s, odp, 1); szukaj(wyst_s, wyst_d, odp, 0); krawedzie_ze_stosu(preorder_d, wyst_d, odp, 0); cout << odp.size() << "\n"; while(!odp.empty()) { string wypisz = odp.front(); odp.pop(); cout << wypisz << "\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 | #include <bits/stdc++.h> using namespace std; #define fi first #define se second pair <int, int> para(int a, int b) { if(a < b) return {a, b}; return {b, a}; } void wczytaj(int &ile, vector <vector <int> > &kraw, set <pair <int, int> > &s) { cin >> ile; for(int i = 1; i <= ile; i++) { int a, b; cin >> a >> b; kraw[a].push_back(b); kraw[b].push_back(a); s.insert(para(a, b)); } } void dfs(int x, deque <int> &stos, vector <vector <int> > &kraw, vector <bool> &odw) { odw[x] = 1; stos.push_back(x); for(int v : kraw[x]) if(!odw[v]) dfs(v, stos, kraw, odw); } string nowy_string(int a, int b, bool dodaj) { string ret = ""; if(dodaj) ret += "+ "; else ret += "- "; ret += to_string(a); ret += " "; ret += to_string(b); return ret; } void krawedzie_ze_stosu(deque <int> &q, set <pair <int, int> > &s, queue <string> &odp, bool dodaj) { while(!q.empty()) { int x; if(dodaj) { x = q.front(); q.pop_front(); } else { x = q.back(); q.pop_back(); } if(x != 1 && s.find({1, x}) == s.end()) odp.push(nowy_string(1, x, dodaj)); } } void szukaj(set <pair <int, int> > &set1, set <pair <int, int> > &set2, queue <string> &odp, bool dodaj) { for(auto kraw : set1) { if(kraw.fi != 1 && kraw.se != 1 && set2.find(kraw) == set2.end()) odp.push(nowy_string(kraw.fi, kraw.se, dodaj)); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, ms, md; cin >> n; set <pair <int, int> > wyst_s; set <pair <int, int> > wyst_d; vector <vector <int> > kraw_s(n + 1); vector <vector <int> > kraw_d(n + 1); wczytaj(ms, kraw_s, wyst_s); wczytaj(md, kraw_d, wyst_d); deque <int> preorder_s; deque <int> preorder_d; vector <bool> odw_s(n + 1); vector <bool> odw_d(n + 1); dfs(1, preorder_s, kraw_s, odw_s); dfs(1, preorder_d, kraw_d, odw_d); queue <string> odp; krawedzie_ze_stosu(preorder_s, wyst_s, odp, 1); szukaj(wyst_d, wyst_s, odp, 1); szukaj(wyst_s, wyst_d, odp, 0); krawedzie_ze_stosu(preorder_d, wyst_d, odp, 0); cout << odp.size() << "\n"; while(!odp.empty()) { string wypisz = odp.front(); odp.pop(); cout << wypisz << "\n"; } } |