#include <bits/stdc++.h> using namespace std; constexpr int M = 30'005; struct odp{ char znak; int a, b; }; set<pair<int, int>> sk; set<pair<int, int>> s; vector<vector<int>> g(M); vector<vector<int>> g2(M); vector<int> preorder; bool odw[M]; vector<odp> odpowiedzi; vector<pair<int, int>> dodatkowo; void dfs(int v){ odw[v] = 1; preorder.push_back(v); for(auto i:g[v]) if(!odw[i]) dfs(i); } void dfs2(int v){ odw[v] = 1; preorder.push_back(v); for(auto i:g2[v]) if(!odw[i]) dfs2(i); } int main(){ cin.tie(0)->sync_with_stdio(0); int n, m; cin>>n>>m; for(int i=1; i<=m; i++){ int a, b; cin>>a>>b; g[a].push_back(b); g[b].push_back(a); dodatkowo.push_back({a, b}); sk.insert({a, b}); sk.insert({b, a}); } dfs(1); for(int i=1; i<preorder.size(); i++){ int akt = preorder[i]; if(sk.count({1, akt})==0){ odpowiedzi.push_back({'+', 1, akt}); sk.insert({1, akt}); sk.insert({akt, 1}); } } cin>>m; for(int i=1; i<=m; i++){ int a, b; cin>>a>>b; s.insert({a, b}); s.insert({b, a}); if(sk.count({a, b})==0){ odpowiedzi.push_back({'+', a, b}); g2[a].push_back(b); g2[b].push_back(a); } } for(auto i:dodatkowo){ if(i.first!=1 && i.second!=1){ if(s.count({i.first, i.second})==0){ odpowiedzi.push_back({'-', i.first, i.second}); } } } for(auto i:s) g2[i.first].push_back(i.second); preorder.clear(); for(int i=1; i<=n; i++) odw[i] = 0; dfs2(1); reverse(preorder.begin(), preorder.end()); for(auto i:preorder) if(i!=1){ if(s.count({1, i})==0){ odpowiedzi.push_back({'-', 1, i}); } } cout<<odpowiedzi.size()<<endl; for(auto i:odpowiedzi) cout<<i.znak<<" "<<i.a<<" "<<i.b<<endl; return 0; }
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 | #include <bits/stdc++.h> using namespace std; constexpr int M = 30'005; struct odp{ char znak; int a, b; }; set<pair<int, int>> sk; set<pair<int, int>> s; vector<vector<int>> g(M); vector<vector<int>> g2(M); vector<int> preorder; bool odw[M]; vector<odp> odpowiedzi; vector<pair<int, int>> dodatkowo; void dfs(int v){ odw[v] = 1; preorder.push_back(v); for(auto i:g[v]) if(!odw[i]) dfs(i); } void dfs2(int v){ odw[v] = 1; preorder.push_back(v); for(auto i:g2[v]) if(!odw[i]) dfs2(i); } int main(){ cin.tie(0)->sync_with_stdio(0); int n, m; cin>>n>>m; for(int i=1; i<=m; i++){ int a, b; cin>>a>>b; g[a].push_back(b); g[b].push_back(a); dodatkowo.push_back({a, b}); sk.insert({a, b}); sk.insert({b, a}); } dfs(1); for(int i=1; i<preorder.size(); i++){ int akt = preorder[i]; if(sk.count({1, akt})==0){ odpowiedzi.push_back({'+', 1, akt}); sk.insert({1, akt}); sk.insert({akt, 1}); } } cin>>m; for(int i=1; i<=m; i++){ int a, b; cin>>a>>b; s.insert({a, b}); s.insert({b, a}); if(sk.count({a, b})==0){ odpowiedzi.push_back({'+', a, b}); g2[a].push_back(b); g2[b].push_back(a); } } for(auto i:dodatkowo){ if(i.first!=1 && i.second!=1){ if(s.count({i.first, i.second})==0){ odpowiedzi.push_back({'-', i.first, i.second}); } } } for(auto i:s) g2[i.first].push_back(i.second); preorder.clear(); for(int i=1; i<=n; i++) odw[i] = 0; dfs2(1); reverse(preorder.begin(), preorder.end()); for(auto i:preorder) if(i!=1){ if(s.count({1, i})==0){ odpowiedzi.push_back({'-', 1, i}); } } cout<<odpowiedzi.size()<<endl; for(auto i:odpowiedzi) cout<<i.znak<<" "<<i.a<<" "<<i.b<<endl; return 0; } |