#include <iostream> #include <set> #include <vector> std::set<std::pair<int,int> > cr; struct Q{ bool t; int a, b; Q(bool t2, int a2, int b2):t{t2}, a{a2}, b{b2}{} }; std::vector<Q> q; void add(int a, int b){ if (cr.find(std::make_pair(std::min(a,b),std::max(a,b)))==cr.end()){ cr.emplace(std::min(a,b),std::max(a,b)); q.emplace_back(true,a,b); } } void rem(int a, int b){ cr.erase(std::make_pair(std::min(a,b),std::max(a,b))); q.emplace_back(false,a,b); } void dfs1(std::vector<int>* t, bool* vis, int start){ vis[start]=true; if (start!=1)add(1,start); for (auto a:t[start]){ if(!vis[a])dfs1(t,vis,a); } } void dfs2(std::vector<int>* t, bool* vis, bool* one_sas, int start){ //std::cout<<start<<'\n'; vis[start]=true; for (auto a:t[start]){ if(!vis[a])dfs2(t,vis,one_sas,a); } if (!one_sas[start] and start!=1)rem(1,start); } int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(0); int n; std::cin>>n; { int s; std::cin>>s; std::vector<int> t[n+1]; bool vis[n+1]; for (size_t i=1; i<=n; ++i)vis[i]=false; for (size_t i=0; i<s; ++i){ int a, b; std::cin>>a>>b; cr.emplace(std::min(a,b),std::max(a,b)); t[a].push_back(b); t[b].push_back(a); } dfs1(t,vis,1); //dodane 1->wszystko +30k } { std::vector<std::pair<int,int> > tmp; for (auto a:cr){ if (a.first!=1 and a.second!=1)tmp.push_back(a); } for (auto a:tmp)rem(a.first,a.second); //tylko 1->wszystko +50k } { int s; std::cin>>s; std::vector<int> t[n+1]; bool vis[n+1], one_sas[n+1]; for (size_t i=1; i<=n; ++i)vis[i]=false, one_sas[i]=false; for (size_t i=0; i<s; ++i){ int a, b; std::cin>>a>>b; if (a==1)one_sas[b]=true; if (b==1)one_sas[a]=true; add(a,b); t[a].push_back(b); t[b].push_back(a); } // 1->wszystko + to co ma byc +50k dfs2(t,vis,one_sas,1); // to co ma byc +30k } std::cout<<q.size()<<'\n'; for (auto a:q){ if (a.t){ std::cout<<'+'<<' '<<a.a<<' '<<a.b<<'\n'; }else{ std::cout<<'-'<<' '<<a.a<<' '<<a.b<<'\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 | #include <iostream> #include <set> #include <vector> std::set<std::pair<int,int> > cr; struct Q{ bool t; int a, b; Q(bool t2, int a2, int b2):t{t2}, a{a2}, b{b2}{} }; std::vector<Q> q; void add(int a, int b){ if (cr.find(std::make_pair(std::min(a,b),std::max(a,b)))==cr.end()){ cr.emplace(std::min(a,b),std::max(a,b)); q.emplace_back(true,a,b); } } void rem(int a, int b){ cr.erase(std::make_pair(std::min(a,b),std::max(a,b))); q.emplace_back(false,a,b); } void dfs1(std::vector<int>* t, bool* vis, int start){ vis[start]=true; if (start!=1)add(1,start); for (auto a:t[start]){ if(!vis[a])dfs1(t,vis,a); } } void dfs2(std::vector<int>* t, bool* vis, bool* one_sas, int start){ //std::cout<<start<<'\n'; vis[start]=true; for (auto a:t[start]){ if(!vis[a])dfs2(t,vis,one_sas,a); } if (!one_sas[start] and start!=1)rem(1,start); } int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(0); int n; std::cin>>n; { int s; std::cin>>s; std::vector<int> t[n+1]; bool vis[n+1]; for (size_t i=1; i<=n; ++i)vis[i]=false; for (size_t i=0; i<s; ++i){ int a, b; std::cin>>a>>b; cr.emplace(std::min(a,b),std::max(a,b)); t[a].push_back(b); t[b].push_back(a); } dfs1(t,vis,1); //dodane 1->wszystko +30k } { std::vector<std::pair<int,int> > tmp; for (auto a:cr){ if (a.first!=1 and a.second!=1)tmp.push_back(a); } for (auto a:tmp)rem(a.first,a.second); //tylko 1->wszystko +50k } { int s; std::cin>>s; std::vector<int> t[n+1]; bool vis[n+1], one_sas[n+1]; for (size_t i=1; i<=n; ++i)vis[i]=false, one_sas[i]=false; for (size_t i=0; i<s; ++i){ int a, b; std::cin>>a>>b; if (a==1)one_sas[b]=true; if (b==1)one_sas[a]=true; add(a,b); t[a].push_back(b); t[b].push_back(a); } // 1->wszystko + to co ma byc +50k dfs2(t,vis,one_sas,1); // to co ma byc +30k } std::cout<<q.size()<<'\n'; for (auto a:q){ if (a.t){ std::cout<<'+'<<' '<<a.a<<' '<<a.b<<'\n'; }else{ std::cout<<'-'<<' '<<a.a<<' '<<a.b<<'\n'; } } } |