#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> edges;
vector<vector<int>> cEdges;
vector<bool> visited;
vector<int> order;
set<pair<int, int>> edg, hasToExist;
vector<string> moves;
int origin;
void dfs(int cn){
visited[cn] = 1;
for(int node : edges[cn]){
if(visited[node]) continue;
if(edg.find({origin, node}) == edg.end() and edg.find({node, origin}) == edg.end()){
moves.push_back("+ "+to_string(origin+1)+" "+to_string(node+1));
edg.insert({origin, node});
edges[node].push_back(origin);
edges[origin].push_back(node);
}
dfs(node);
}
}
void dfs2(int cn){
visited[cn] = 1;
for(int node : cEdges[cn]){
if(visited[node]) continue;
dfs2(node);
}
order.push_back(cn);
}
void addEdges(int n1, int n2){
hasToExist.insert({n1, n2});
if(edg.find({n1, n2}) != edg.end() or edg.find({n2, n1}) != edg.end()) return;
moves.push_back("+ "+to_string(n1+1)+" "+to_string(n2+1));
edg.insert({n1, n2});
edges[n1].push_back(n2);
edges[n2].push_back(n1);
}
void removeEdges(int cn){
for(int node : edges[cn]){
if(hasToExist.find({node, cn}) != hasToExist.end() or hasToExist.find({cn, node}) != hasToExist.end()){
continue;
}
if(edg.find({node, cn})==edg.end() and edg.find({cn, node})==edg.end()){
continue;
}
moves.push_back("- "+to_string(node+1)+" "+to_string(cn+1));
edg.erase({node, cn});
edg.erase({cn, node});
}
}
int main(){
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
int n, m1, m2;
cin>>n;
cin>>m1;
int a, b;
edges.assign(n, {});
visited.assign(n, 0);
for(int i = 0; i<m1; i++){
cin>>a>>b;
a--; b--;
edg.insert({a, b});
edges[a].push_back(b);
edges[b].push_back(a);
}
origin = 0;
dfs(origin);
visited.assign(n, 0);
cEdges.assign(n, {});
cin>>m2;
for(int i = 0; i<m2; i++){
cin>>a>>b;
a--; b--;
cEdges[a].push_back(b);
cEdges[b].push_back(a);
addEdges(a, b);
}
dfs2(origin);
for(int i = 0; i<n; i++){
sort(edges[i].rbegin(), edges[i].rend());
}
for(int node : order){
removeEdges(node);
}
cout<<moves.size()<<"\n";
for(string move : moves){
cout<<move<<"\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 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 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <bits/stdc++.h> using namespace std; vector<vector<int>> edges; vector<vector<int>> cEdges; vector<bool> visited; vector<int> order; set<pair<int, int>> edg, hasToExist; vector<string> moves; int origin; void dfs(int cn){ visited[cn] = 1; for(int node : edges[cn]){ if(visited[node]) continue; if(edg.find({origin, node}) == edg.end() and edg.find({node, origin}) == edg.end()){ moves.push_back("+ "+to_string(origin+1)+" "+to_string(node+1)); edg.insert({origin, node}); edges[node].push_back(origin); edges[origin].push_back(node); } dfs(node); } } void dfs2(int cn){ visited[cn] = 1; for(int node : cEdges[cn]){ if(visited[node]) continue; dfs2(node); } order.push_back(cn); } void addEdges(int n1, int n2){ hasToExist.insert({n1, n2}); if(edg.find({n1, n2}) != edg.end() or edg.find({n2, n1}) != edg.end()) return; moves.push_back("+ "+to_string(n1+1)+" "+to_string(n2+1)); edg.insert({n1, n2}); edges[n1].push_back(n2); edges[n2].push_back(n1); } void removeEdges(int cn){ for(int node : edges[cn]){ if(hasToExist.find({node, cn}) != hasToExist.end() or hasToExist.find({cn, node}) != hasToExist.end()){ continue; } if(edg.find({node, cn})==edg.end() and edg.find({cn, node})==edg.end()){ continue; } moves.push_back("- "+to_string(node+1)+" "+to_string(cn+1)); edg.erase({node, cn}); edg.erase({cn, node}); } } int main(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int n, m1, m2; cin>>n; cin>>m1; int a, b; edges.assign(n, {}); visited.assign(n, 0); for(int i = 0; i<m1; i++){ cin>>a>>b; a--; b--; edg.insert({a, b}); edges[a].push_back(b); edges[b].push_back(a); } origin = 0; dfs(origin); visited.assign(n, 0); cEdges.assign(n, {}); cin>>m2; for(int i = 0; i<m2; i++){ cin>>a>>b; a--; b--; cEdges[a].push_back(b); cEdges[b].push_back(a); addEdges(a, b); } dfs2(origin); for(int i = 0; i<n; i++){ sort(edges[i].rbegin(), edges[i].rend()); } for(int node : order){ removeEdges(node); } cout<<moves.size()<<"\n"; for(string move : moves){ cout<<move<<"\n"; } return 0; } |
English