#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; } |
English