#include<iostream> #include<vector> #include<set> using namespace std; vector< pair< char,pair<int,int> > >odp; set< pair<int,int> >s1,s2;//s1 - koncowa spojna, s2 - aktualna spojna set< pair<int,int> >::iterator it; struct wi{ vector<int>v; int o=-1; int czy_odw=0; }*w,*ww; void deefes(int a){ w[a].czy_odw=1; for(int i=0;i<w[a].v.size();i++){ if(w[w[a].v[i]].czy_odw==0){ if(s2.find({1,w[a].v[i]})==s2.end()){ odp.push_back({'+',{1,w[a].v[i]}}); s2.insert({1,w[a].v[i]}); } deefes(w[a].v[i]); } } return; } void deefes2(int a){ ww[a].czy_odw=1; for(int i=0;i<ww[a].v.size();i++){ if(ww[ww[a].v[i]].czy_odw==0){ deefes2(ww[a].v[i]); } } if(s1.find({1,a})==s1.end()&&a!=1)odp.push_back({'-',{1,a}}); return; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,v1,v2,m; cin>>n>>m; w=new wi[n+1]; ww=new wi[n+1]; for(int i=0;i<m;i++){ cin>>v1>>v2; w[v1].v.push_back(v2); w[v2].v.push_back(v1); s2.insert({min(v1,v2),max(v1,v2)}); } deefes(1);//laczenie z 1 wszystkich cin>>m; for(int i=0;i<m;i++){ cin>>v1>>v2; if(s2.find({v1,v2})==s2.end()){ odp.push_back({'+',{v1,v2}}); s2.insert({min(v1,v2),max(v1,v2)}); } ww[v1].v.push_back(v2); ww[v2].v.push_back(v1); s1.insert({min(v1,v2),max(v1,v2)}); } for(it=s2.begin();it!=s2.end();it++){ v1=(*it).first; v2=(*it).second; if(min(v1,v2)!=1&&s1.find(*it)==s1.end())odp.push_back({'-',*it}); } deefes2(1); cout<<odp.size()<<'\n'; for(int i=0;i<odp.size();i++)cout<<odp[i].first<<' '<<odp[i].second.first<<' '<<odp[i].second.second<<'\n'; 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 | #include<iostream> #include<vector> #include<set> using namespace std; vector< pair< char,pair<int,int> > >odp; set< pair<int,int> >s1,s2;//s1 - koncowa spojna, s2 - aktualna spojna set< pair<int,int> >::iterator it; struct wi{ vector<int>v; int o=-1; int czy_odw=0; }*w,*ww; void deefes(int a){ w[a].czy_odw=1; for(int i=0;i<w[a].v.size();i++){ if(w[w[a].v[i]].czy_odw==0){ if(s2.find({1,w[a].v[i]})==s2.end()){ odp.push_back({'+',{1,w[a].v[i]}}); s2.insert({1,w[a].v[i]}); } deefes(w[a].v[i]); } } return; } void deefes2(int a){ ww[a].czy_odw=1; for(int i=0;i<ww[a].v.size();i++){ if(ww[ww[a].v[i]].czy_odw==0){ deefes2(ww[a].v[i]); } } if(s1.find({1,a})==s1.end()&&a!=1)odp.push_back({'-',{1,a}}); return; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,v1,v2,m; cin>>n>>m; w=new wi[n+1]; ww=new wi[n+1]; for(int i=0;i<m;i++){ cin>>v1>>v2; w[v1].v.push_back(v2); w[v2].v.push_back(v1); s2.insert({min(v1,v2),max(v1,v2)}); } deefes(1);//laczenie z 1 wszystkich cin>>m; for(int i=0;i<m;i++){ cin>>v1>>v2; if(s2.find({v1,v2})==s2.end()){ odp.push_back({'+',{v1,v2}}); s2.insert({min(v1,v2),max(v1,v2)}); } ww[v1].v.push_back(v2); ww[v2].v.push_back(v1); s1.insert({min(v1,v2),max(v1,v2)}); } for(it=s2.begin();it!=s2.end();it++){ v1=(*it).first; v2=(*it).second; if(min(v1,v2)!=1&&s1.find(*it)==s1.end())odp.push_back({'-',*it}); } deefes2(1); cout<<odp.size()<<'\n'; for(int i=0;i<odp.size();i++)cout<<odp[i].first<<' '<<odp[i].second.first<<' '<<odp[i].second.second<<'\n'; return 0; } |