#include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto&operator<<(auto&o,tuple<auto,auto,auto>p){return o<<"("<<get<0>(p)<<", "<<get<1>(p)<<", "<<get<2>(p)<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif int main() { cin.tie(0)->sync_with_stdio(0); int n, ms, md; cin >> n >> ms; vector<vector<int>> graph(n); set<pair<int, int>> ini_edges, fin_edges; REP (i, ms) { int u, v; cin >> u >> v; --u; --v; if (u > v) swap(u, v); ini_edges.emplace(u, v); graph[u].emplace_back(v); graph[v].emplace_back(u); } vector<tuple<int, int, int>> ans; { vector<int> odw(n); function<void(int)> dfs = [&](int v) { odw[v] = 1; for (int u : graph[v]) if (!odw[u]) { if (v && !ini_edges.count(pair(0, u))) ans.emplace_back(1, 0, u); dfs(u); } }; dfs(0); } debug(ans); vector<int> to_erase(n, 1); to_erase[0] = 0; vector<vector<int>> ngraph(n); cin >> md; REP (i, md) { int u, v; cin >> u >> v; --u; --v; if (u > v) swap(u, v); ngraph[u].emplace_back(v); ngraph[v].emplace_back(u); fin_edges.emplace(u, v); if (u == 0) to_erase[v] = 0; else if (!ini_edges.count(pair(u, v))) ans.emplace_back(1, u, v); } for (auto [u, v] : ini_edges) { if (!u) continue; if (!fin_edges.count(pair(u, v))) ans.emplace_back(-1, u, v); } vector<int> odw(n); function<void(int)> dfs = [&](int v) { odw[v] = 1; for (int u : ngraph[v]) if (!odw[u]) dfs(u); if (v && !fin_edges.count(pair(0, v))) ans.emplace_back(-1, 0, v); }; dfs(0); cout << ssize(ans) << '\n'; for (auto [type, u, v] : ans) { if (type == -1) cout << '-'; else cout << '+'; cout << ' ' << u + 1 << ' ' << v + 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 | #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto&operator<<(auto&o,tuple<auto,auto,auto>p){return o<<"("<<get<0>(p)<<", "<<get<1>(p)<<", "<<get<2>(p)<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif int main() { cin.tie(0)->sync_with_stdio(0); int n, ms, md; cin >> n >> ms; vector<vector<int>> graph(n); set<pair<int, int>> ini_edges, fin_edges; REP (i, ms) { int u, v; cin >> u >> v; --u; --v; if (u > v) swap(u, v); ini_edges.emplace(u, v); graph[u].emplace_back(v); graph[v].emplace_back(u); } vector<tuple<int, int, int>> ans; { vector<int> odw(n); function<void(int)> dfs = [&](int v) { odw[v] = 1; for (int u : graph[v]) if (!odw[u]) { if (v && !ini_edges.count(pair(0, u))) ans.emplace_back(1, 0, u); dfs(u); } }; dfs(0); } debug(ans); vector<int> to_erase(n, 1); to_erase[0] = 0; vector<vector<int>> ngraph(n); cin >> md; REP (i, md) { int u, v; cin >> u >> v; --u; --v; if (u > v) swap(u, v); ngraph[u].emplace_back(v); ngraph[v].emplace_back(u); fin_edges.emplace(u, v); if (u == 0) to_erase[v] = 0; else if (!ini_edges.count(pair(u, v))) ans.emplace_back(1, u, v); } for (auto [u, v] : ini_edges) { if (!u) continue; if (!fin_edges.count(pair(u, v))) ans.emplace_back(-1, u, v); } vector<int> odw(n); function<void(int)> dfs = [&](int v) { odw[v] = 1; for (int u : ngraph[v]) if (!odw[u]) dfs(u); if (v && !fin_edges.count(pair(0, v))) ans.emplace_back(-1, 0, v); }; dfs(0); cout << ssize(ans) << '\n'; for (auto [type, u, v] : ans) { if (type == -1) cout << '-'; else cout << '+'; cout << ' ' << u + 1 << ' ' << v + 1 << '\n'; } } |