#include <bits/stdc++.h> using namespace std; typedef long long LL; bool org_sasiedzi1[30001]; bool konc_sasiedzi2[30001]; bool visited1[30001]; vector<vector<int>> graf1; vector<vector<int>> graf2; vector<int> kolejnosc; vector<pair<char, pair<int, int>>> odp; void DFS_dod(int u){ visited1[u]=true; for(int i=0; i<graf1[u].size(); i++){ if(!visited1[graf1[u][i]]){ if(!org_sasiedzi1[graf1[u][i]]){ odp.push_back({'+', {1, graf1[u][i]}}); } kolejnosc.push_back(graf1[u][i]); DFS_dod(graf1[u][i]); } } } void usuwanie(){ for(int i=kolejnosc.size()-1; i>=0; i--){ if(!konc_sasiedzi2[kolejnosc[i]]){ odp.push_back({'-', {1, kolejnosc[i]}}); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m1, m2, a, b; cin>>n>>m1; graf1.resize(n+1); graf2.resize(n+1); for(int i=0; i<m1; i++){ cin>>a>>b; graf1[a].push_back(b); graf1[b].push_back(a); } for(int i=0; i<graf1[1].size(); i++) org_sasiedzi1[graf1[1][i]]=true; cin>>m2; for(int i=0; i<m2; i++){ cin>>a>>b; graf2[a].push_back(b); graf2[b].push_back(a); } for(int i=0; i<graf2[1].size(); i++) konc_sasiedzi2[graf2[1][i]]=true; DFS_dod(1); for(int i=2; i<=n; i++){ sort(graf1[i].begin(), graf1[i].end()); sort(graf2[i].begin(), graf2[i].end()); for(int j=0; j<graf1[i].size(); j++){ if(graf1[i][j]>i && (*lower_bound(graf2[i].begin(), graf2[i].end(), graf1[i][j]))!=graf1[i][j]){ odp.push_back({'-', {i, graf1[i][j]}}); } } for(int j=0; j<graf2[i].size(); j++){ if(graf2[i][j]>i && (*lower_bound(graf1[i].begin(), graf1[i].end(), graf2[i][j]))!=graf2[i][j]){ odp.push_back({'+', {i, graf2[i][j]}}); } } } usuwanie(); 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 72 73 74 75 76 77 78 79 80 81 82 83 | #include <bits/stdc++.h> using namespace std; typedef long long LL; bool org_sasiedzi1[30001]; bool konc_sasiedzi2[30001]; bool visited1[30001]; vector<vector<int>> graf1; vector<vector<int>> graf2; vector<int> kolejnosc; vector<pair<char, pair<int, int>>> odp; void DFS_dod(int u){ visited1[u]=true; for(int i=0; i<graf1[u].size(); i++){ if(!visited1[graf1[u][i]]){ if(!org_sasiedzi1[graf1[u][i]]){ odp.push_back({'+', {1, graf1[u][i]}}); } kolejnosc.push_back(graf1[u][i]); DFS_dod(graf1[u][i]); } } } void usuwanie(){ for(int i=kolejnosc.size()-1; i>=0; i--){ if(!konc_sasiedzi2[kolejnosc[i]]){ odp.push_back({'-', {1, kolejnosc[i]}}); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m1, m2, a, b; cin>>n>>m1; graf1.resize(n+1); graf2.resize(n+1); for(int i=0; i<m1; i++){ cin>>a>>b; graf1[a].push_back(b); graf1[b].push_back(a); } for(int i=0; i<graf1[1].size(); i++) org_sasiedzi1[graf1[1][i]]=true; cin>>m2; for(int i=0; i<m2; i++){ cin>>a>>b; graf2[a].push_back(b); graf2[b].push_back(a); } for(int i=0; i<graf2[1].size(); i++) konc_sasiedzi2[graf2[1][i]]=true; DFS_dod(1); for(int i=2; i<=n; i++){ sort(graf1[i].begin(), graf1[i].end()); sort(graf2[i].begin(), graf2[i].end()); for(int j=0; j<graf1[i].size(); j++){ if(graf1[i][j]>i && (*lower_bound(graf2[i].begin(), graf2[i].end(), graf1[i][j]))!=graf1[i][j]){ odp.push_back({'-', {i, graf1[i][j]}}); } } for(int j=0; j<graf2[i].size(); j++){ if(graf2[i][j]>i && (*lower_bound(graf1[i].begin(), graf1[i].end(), graf2[i][j]))!=graf2[i][j]){ odp.push_back({'+', {i, graf2[i][j]}}); } } } usuwanie(); 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; } |