#include <bits/stdc++.h>
using namespace std;
vector<unordered_set<int>> edges;
vector<unordered_set<int>> edges_wanted;
int n, m_s, m_d;
enum op_t : bool {
op_add,
op_remove
};
struct item {
op_t op;
int a,b;
};
vector<item> logs;
void dfs_add(int v, vector<bool> &seen) {
seen[v] = true;
if (!edges[v].contains(0) && v != 0)
logs.push_back((item){.op = op_add, .a = 0, .b = v});
for (int e : edges[v])
if (!seen[e])
dfs_add(e, seen);
}
void dfs_remove(int v, vector<bool> &seen) {
seen[v] = true;
for (int e : edges_wanted[v])
if (!seen[e])
dfs_remove(e, seen);
if (edges[v].contains(0) && !edges_wanted[v].contains(0))
logs.push_back((item){.op = op_remove, .a = 0, .b = v});
}
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
cin >> n;
edges = vector<unordered_set<int>> (n, unordered_set<int>());
edges_wanted = vector<unordered_set<int>> (n, unordered_set<int>());
cin >> m_s;
for (int i = 0, a, b; i < m_s; i++) {
cin >> a >> b;
edges[a - 1].insert(b - 1);
edges[b - 1].insert(a - 1);
}
cin >> m_d;
for (int i = 0, a, b; i < m_d; i++) {
cin >> a >> b;
edges_wanted[a - 1].insert(b - 1);
edges_wanted[b - 1].insert(a - 1);
}
vector<bool> seen(n, false);
dfs_add(0, seen);
for (auto e : logs) {
edges[e.a].insert(e.b);
edges[e.b].insert(e.a);
}
for (int i = 1; i < n; i++) {
vector<int> edges_copy;
for (int e : edges[i])
edges_copy.push_back(e);
for (int e : edges_copy) {
if (e != 0 && !edges_wanted[i].contains(e)) {
logs.push_back((item){.op = op_remove, .a = i, .b = e});
edges[i].erase(e);
edges[e].erase(i);
}
}
}
for (int i = 1; i < n; i++) {
for (int e : edges_wanted[i]) {
if (!edges[i].contains(e)) {
logs.push_back((item){.op = op_add, .a = i, .b = e});
edges[i].insert(e);
edges[e].insert(i);
}
}
}
seen = vector<bool>(n, false);
dfs_remove(0, seen);
cout << logs.size() << "\n";
for (auto e : logs) {
cout << (e.op == op_add ? '+' : '-') << " " << e.a + 1 << " " << e.b + 1 << "\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; vector<unordered_set<int>> edges; vector<unordered_set<int>> edges_wanted; int n, m_s, m_d; enum op_t : bool { op_add, op_remove }; struct item { op_t op; int a,b; }; vector<item> logs; void dfs_add(int v, vector<bool> &seen) { seen[v] = true; if (!edges[v].contains(0) && v != 0) logs.push_back((item){.op = op_add, .a = 0, .b = v}); for (int e : edges[v]) if (!seen[e]) dfs_add(e, seen); } void dfs_remove(int v, vector<bool> &seen) { seen[v] = true; for (int e : edges_wanted[v]) if (!seen[e]) dfs_remove(e, seen); if (edges[v].contains(0) && !edges_wanted[v].contains(0)) logs.push_back((item){.op = op_remove, .a = 0, .b = v}); } int main() { std::ios::sync_with_stdio(0); std::cin.tie(0); cin >> n; edges = vector<unordered_set<int>> (n, unordered_set<int>()); edges_wanted = vector<unordered_set<int>> (n, unordered_set<int>()); cin >> m_s; for (int i = 0, a, b; i < m_s; i++) { cin >> a >> b; edges[a - 1].insert(b - 1); edges[b - 1].insert(a - 1); } cin >> m_d; for (int i = 0, a, b; i < m_d; i++) { cin >> a >> b; edges_wanted[a - 1].insert(b - 1); edges_wanted[b - 1].insert(a - 1); } vector<bool> seen(n, false); dfs_add(0, seen); for (auto e : logs) { edges[e.a].insert(e.b); edges[e.b].insert(e.a); } for (int i = 1; i < n; i++) { vector<int> edges_copy; for (int e : edges[i]) edges_copy.push_back(e); for (int e : edges_copy) { if (e != 0 && !edges_wanted[i].contains(e)) { logs.push_back((item){.op = op_remove, .a = i, .b = e}); edges[i].erase(e); edges[e].erase(i); } } } for (int i = 1; i < n; i++) { for (int e : edges_wanted[i]) { if (!edges[i].contains(e)) { logs.push_back((item){.op = op_add, .a = i, .b = e}); edges[i].insert(e); edges[e].insert(i); } } } seen = vector<bool>(n, false); dfs_remove(0, seen); cout << logs.size() << "\n"; for (auto e : logs) { cout << (e.op == op_add ? '+' : '-') << " " << e.a + 1 << " " << e.b + 1 << "\n"; } } |
English