#include <bits/stdc++.h> using namespace std; void __print(int x) {cerr << x;} void __print(long x) {cerr << x;} void __print(long long x) {cerr << x;} void __print(unsigned x) {cerr << x;} void __print(unsigned long x) {cerr << x;} void __print(unsigned long long x) {cerr << x;} void __print(float x) {cerr << x;} void __print(double x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << '\'' << x << '\'';} void __print(const char *x) {cerr << '\"' << x << '\"';} void __print(const string &x) {cerr << '\"' << x << '\"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} #ifndef ONLINE_JUDGE #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else #define debug(x...) #endif using ll = long long; constexpr int MAXN = 3e4 + 7; constexpr int oo = 1e9 + 7; set<int> graph[MAXN]; set<int> desired_graph[MAXN]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<pair<int, int>> ans; for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; graph[a].insert(b); graph[b].insert(a); } int md; cin >> md; for (int i = 0; i < md; ++i) { int a, b; cin >> a >> b; desired_graph[a].insert(b); desired_graph[b].insert(a); } // connect everything to one so that we can freely delete and add edges for (int i = 2; i <= n; ++i) { if (graph[1].find(i) == graph[1].end()) { graph[1].insert(i); graph[i].insert(1); ans.push_back({1, i}); } } // now firstly we add what we need to add for (int a = 1; a <= n; ++a) { for (auto b : desired_graph[a]) { if (graph[a].find(b) == graph[a].end()) { // there is no such edge yet graph[a].insert(b); graph[b].insert(a); ans.push_back({a, b}); } } } ans.push_back({-1, -1}); // signal to start deleting from now on // only after adding everything we start deleting leftovers for (int a = 1; a <= n; ++a) { for (auto b : graph[a]) { if (desired_graph[a].find(b) == desired_graph[a].end()) { graph[a].erase(b); graph[b].erase(a); ans.push_back({a, b}); } } } cout << (int)ans.size() - 1 << '\n'; bool deleting = false; for (auto x : ans) { if (x.first == -1 && x.second == -1) { deleting = true; continue; } cout << (deleting ? "- " : "+ "); cout << x.first << ' ' << x.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 | #include <bits/stdc++.h> using namespace std; void __print(int x) {cerr << x;} void __print(long x) {cerr << x;} void __print(long long x) {cerr << x;} void __print(unsigned x) {cerr << x;} void __print(unsigned long x) {cerr << x;} void __print(unsigned long long x) {cerr << x;} void __print(float x) {cerr << x;} void __print(double x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << '\'' << x << '\'';} void __print(const char *x) {cerr << '\"' << x << '\"';} void __print(const string &x) {cerr << '\"' << x << '\"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} #ifndef ONLINE_JUDGE #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else #define debug(x...) #endif using ll = long long; constexpr int MAXN = 3e4 + 7; constexpr int oo = 1e9 + 7; set<int> graph[MAXN]; set<int> desired_graph[MAXN]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<pair<int, int>> ans; for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; graph[a].insert(b); graph[b].insert(a); } int md; cin >> md; for (int i = 0; i < md; ++i) { int a, b; cin >> a >> b; desired_graph[a].insert(b); desired_graph[b].insert(a); } // connect everything to one so that we can freely delete and add edges for (int i = 2; i <= n; ++i) { if (graph[1].find(i) == graph[1].end()) { graph[1].insert(i); graph[i].insert(1); ans.push_back({1, i}); } } // now firstly we add what we need to add for (int a = 1; a <= n; ++a) { for (auto b : desired_graph[a]) { if (graph[a].find(b) == graph[a].end()) { // there is no such edge yet graph[a].insert(b); graph[b].insert(a); ans.push_back({a, b}); } } } ans.push_back({-1, -1}); // signal to start deleting from now on // only after adding everything we start deleting leftovers for (int a = 1; a <= n; ++a) { for (auto b : graph[a]) { if (desired_graph[a].find(b) == desired_graph[a].end()) { graph[a].erase(b); graph[b].erase(a); ans.push_back({a, b}); } } } cout << (int)ans.size() - 1 << '\n'; bool deleting = false; for (auto x : ans) { if (x.first == -1 && x.second == -1) { deleting = true; continue; } cout << (deleting ? "- " : "+ "); cout << x.first << ' ' << x.second << '\n'; } } |