#include <bits/stdc++.h> using namespace std; constexpr int maxN = 3e4; int n, m; int a, b; set<pair<int, int>> edges_now, edges_ans; set<int> S[maxN + 1]; bool visited1[maxN + 1], visited2[maxN + 1]; vector<pair<char, pair<int, int>>> ans; void DFS1(int v) { visited1[v] = true; for(int u : S[v]) { if(!visited1[u]) { if(S[1].find(u) == S[1].end()) { S[1].insert(u); S[u].insert(1); ans.push_back({'+', {1, u}}); } DFS1(u); } } } void DFS2(int v) { visited2[v] = true; for(int u : S[v]) { if(!visited2[u]) { DFS2(u); if(edges_ans.find({1, u}) == edges_ans.end()) { S[1].erase(u); S[u].erase(1); ans.push_back({'-', {1, u}}); } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; cin >> m; for(int i=1; i<=m; i++) { cin >> a >> b; edges_now.insert({min(a, b), max(a, b)}); S[a].insert(b); S[b].insert(a); } visited1[1] = true; for(int i : S[1]) { if(!visited1[i]) { DFS1(i); } } cin >> m; for(int i=1; i<=m; i++) { cin >> a >> b; edges_ans.insert({min(a, b), max(a, b)}); } for(pair<int, int> i : edges_now) { if(i.first != 1) { if(edges_ans.find(i) == edges_ans.end()) { S[i.first].erase(i.second); S[i.second].erase(i.first); ans.push_back({'-', i}); } } } for(pair<int, int> i : edges_ans) { if(i.first != 1) { if(edges_now.find(i) == edges_now.end()) { S[i.first].insert(i.second); S[i.second].insert(i.first); ans.push_back({'+', i}); } } } visited2[1] = true; for(int i : S[1]) { if(!visited2[i] && edges_ans.find({1, i}) != edges_ans.end()) { DFS2(i); } } cout << ans.size() << '\n'; for(pair<char, pair<int, int>> i : ans) { cout << i.first << ' ' << i.second.first << ' ' << i.second.second << '\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 118 119 | #include <bits/stdc++.h> using namespace std; constexpr int maxN = 3e4; int n, m; int a, b; set<pair<int, int>> edges_now, edges_ans; set<int> S[maxN + 1]; bool visited1[maxN + 1], visited2[maxN + 1]; vector<pair<char, pair<int, int>>> ans; void DFS1(int v) { visited1[v] = true; for(int u : S[v]) { if(!visited1[u]) { if(S[1].find(u) == S[1].end()) { S[1].insert(u); S[u].insert(1); ans.push_back({'+', {1, u}}); } DFS1(u); } } } void DFS2(int v) { visited2[v] = true; for(int u : S[v]) { if(!visited2[u]) { DFS2(u); if(edges_ans.find({1, u}) == edges_ans.end()) { S[1].erase(u); S[u].erase(1); ans.push_back({'-', {1, u}}); } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; cin >> m; for(int i=1; i<=m; i++) { cin >> a >> b; edges_now.insert({min(a, b), max(a, b)}); S[a].insert(b); S[b].insert(a); } visited1[1] = true; for(int i : S[1]) { if(!visited1[i]) { DFS1(i); } } cin >> m; for(int i=1; i<=m; i++) { cin >> a >> b; edges_ans.insert({min(a, b), max(a, b)}); } for(pair<int, int> i : edges_now) { if(i.first != 1) { if(edges_ans.find(i) == edges_ans.end()) { S[i.first].erase(i.second); S[i.second].erase(i.first); ans.push_back({'-', i}); } } } for(pair<int, int> i : edges_ans) { if(i.first != 1) { if(edges_now.find(i) == edges_now.end()) { S[i.first].insert(i.second); S[i.second].insert(i.first); ans.push_back({'+', i}); } } } visited2[1] = true; for(int i : S[1]) { if(!visited2[i] && edges_ans.find({1, i}) != edges_ans.end()) { DFS2(i); } } cout << ans.size() << '\n'; for(pair<char, pair<int, int>> i : ans) { cout << i.first << ' ' << i.second.first << ' ' << i.second.second << '\n'; } } |