#include<iostream> #include<set> #include<vector> using namespace std; int n,m1,m2; set<int>tab1[30002],tab2[30002]; set<pair<int,int>>S1,S2; vector<pair<int,pair<int,int>>>v; vector<pair<int,int>>Sp; bool odw[30010]; void dfs(int i,int a) { odw[i]=1; if(tab1[i].find(a)==tab1[i].end() && a!=i) Sp.push_back({min(a,i),max(a,i)}); for(int j:tab1[i]) if(!odw[j])dfs(j,a); } void dfs2(int i,int a) { odw[i]=1; if(tab2[i].find(a)==tab2[i].end() && a!=i) Sp.push_back({min(a,i),max(a,i)}); for(int j:tab2[i]) if(!odw[j])dfs2(j,a); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; cin>>m1; for(int i=0;i<m1;i++) { int a,b; cin>>a>>b; tab1[a].insert(b); tab1[b].insert(a); S1.insert({min(a,b),max(a,b)}); } cin>>m2; for(int i=0;i<m2;i++) { int a,b; cin>>a>>b; tab2[a].insert(b); tab2[b].insert(a); S2.insert({min(a,b),max(a,b)}); } dfs(1,1); for(int i=0;i<=n+2;i++) odw[i]=0; for(pair<int,int>k:Sp) v.push_back({1,k}); for(pair<int,int>k:S2) { if(S1.find(k)==S1.end() && k.first!=1) v.push_back({1,k}); } for(pair<int,int>k:S1) { if(S2.find(k)==S2.end() && k.first!=1) v.push_back({0,k}); } Sp.clear(); dfs2(1,1); for(int i=Sp.size()-1;i>=0;i--) if(S2.find(Sp[i])==S2.end())v.push_back({0,Sp[i]}); cout<<v.size()<<endl; for(int i=0;i<v.size();i++) { if(v[i].first==1)cout<<"+ "; else cout<<"- "; cout<<v[i].second.first<<" "<<v[i].second.second<<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 86 87 88 89 90 91 92 | #include<iostream> #include<set> #include<vector> using namespace std; int n,m1,m2; set<int>tab1[30002],tab2[30002]; set<pair<int,int>>S1,S2; vector<pair<int,pair<int,int>>>v; vector<pair<int,int>>Sp; bool odw[30010]; void dfs(int i,int a) { odw[i]=1; if(tab1[i].find(a)==tab1[i].end() && a!=i) Sp.push_back({min(a,i),max(a,i)}); for(int j:tab1[i]) if(!odw[j])dfs(j,a); } void dfs2(int i,int a) { odw[i]=1; if(tab2[i].find(a)==tab2[i].end() && a!=i) Sp.push_back({min(a,i),max(a,i)}); for(int j:tab2[i]) if(!odw[j])dfs2(j,a); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; cin>>m1; for(int i=0;i<m1;i++) { int a,b; cin>>a>>b; tab1[a].insert(b); tab1[b].insert(a); S1.insert({min(a,b),max(a,b)}); } cin>>m2; for(int i=0;i<m2;i++) { int a,b; cin>>a>>b; tab2[a].insert(b); tab2[b].insert(a); S2.insert({min(a,b),max(a,b)}); } dfs(1,1); for(int i=0;i<=n+2;i++) odw[i]=0; for(pair<int,int>k:Sp) v.push_back({1,k}); for(pair<int,int>k:S2) { if(S1.find(k)==S1.end() && k.first!=1) v.push_back({1,k}); } for(pair<int,int>k:S1) { if(S2.find(k)==S2.end() && k.first!=1) v.push_back({0,k}); } Sp.clear(); dfs2(1,1); for(int i=Sp.size()-1;i>=0;i--) if(S2.find(Sp[i])==S2.end())v.push_back({0,Sp[i]}); cout<<v.size()<<endl; for(int i=0;i<v.size();i++) { if(v[i].first==1)cout<<"+ "; else cout<<"- "; cout<<v[i].second.first<<" "<<v[i].second.second<<endl; } return 0; } |