#include <bits/stdc++.h>
using namespace std;
int n,ms,md;
int dist[30003];
int order[30003];
unordered_map<int, unordered_set<int>> src;
unordered_map<int, unordered_set<int>> dest;
void connect(unordered_map<int, unordered_set<int>> &m, int a, int b) {
auto it = m.find(a);
if(it != m.end()) {
it->second.insert(b);
} else {
unordered_set<int> s;
s.insert(b);
m[a] = s;
}
it = m.find(b);
if(it != m.end()) {
it->second.insert(a);
} else {
unordered_set<int> s;
s.insert(a);
m[b] = s;
}
}
bool srt(int a, int b) {
return dist[a] < dist[b];
}
void orderByDistance(unordered_map<int, unordered_set<int>> &m) {
for(int i=0;i<=n;i++) {
dist[i] = -1;
order[i] = i+1;
}
list<int> stck;
dist[1] = 0;
stck.push_back(1);
while(stck.size() > 0) {
int nr = stck.back();
stck.pop_back();
auto &it = m.find(nr)->second;
for(auto &nbr: it) {
if(dist[nbr] == -1) {
dist[nbr] = dist[nr]+1;
stck.push_back(nbr);
}
}
}
sort(order, order+n, srt);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
stringstream ss;
int ssSize = 0;
int a, b;
cin >> n;
cin >> ms;
for(int i=0;i<ms;i++) {
cin >> a >> b;
connect(src, a, b);
}
cin >> md;
for(int i=0;i<md;i++) {
cin >> a >> b;
connect(dest, a, b);
}
orderByDistance(src);
auto &oneNeighbours = src.find(1)->second;
for(int i=0;i<n;i++) {
int nr = order[i];
if(nr == 1) continue;
if(oneNeighbours.find(nr) == oneNeighbours.end()) {
ss << "+ 1 " << nr << "\n";
ssSize++;
}
}
for (auto &p: src) {
int nr = p.first;
if(nr == 1) continue;
auto &destSet = dest.find(nr)->second;
for(auto &nbr: p.second) {
if(nbr == 1) continue;
if(nbr > nr) {
if(destSet.find(nbr) == destSet.end()) {
ss << "- " << nr << " " << nbr << "\n";
ssSize++;
}
}
}
}
for (auto &p: dest) {
int nr = p.first;
if(nr == 1) continue;
auto &srcSet = src.find(nr)->second;
for(auto &nbr: p.second) {
if(nbr == 1) continue;
if(nbr > nr) {
if(srcSet.find(nbr) == srcSet.end()) {
ss << "+ " << nr << " " << nbr << "\n";
ssSize++;
}
}
}
}
orderByDistance(dest);
oneNeighbours = dest.find(1)->second;
for(int i=n-1;i>=0;i--) {
int nr = order[i];
if(nr == 1) continue;
if(oneNeighbours.find(nr) == oneNeighbours.end()) {
ss << "- 1 " << nr << "\n";
ssSize++;
}
}
cout << ssSize << "\n" << ss.str();
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | #include <bits/stdc++.h> using namespace std; int n,ms,md; int dist[30003]; int order[30003]; unordered_map<int, unordered_set<int>> src; unordered_map<int, unordered_set<int>> dest; void connect(unordered_map<int, unordered_set<int>> &m, int a, int b) { auto it = m.find(a); if(it != m.end()) { it->second.insert(b); } else { unordered_set<int> s; s.insert(b); m[a] = s; } it = m.find(b); if(it != m.end()) { it->second.insert(a); } else { unordered_set<int> s; s.insert(a); m[b] = s; } } bool srt(int a, int b) { return dist[a] < dist[b]; } void orderByDistance(unordered_map<int, unordered_set<int>> &m) { for(int i=0;i<=n;i++) { dist[i] = -1; order[i] = i+1; } list<int> stck; dist[1] = 0; stck.push_back(1); while(stck.size() > 0) { int nr = stck.back(); stck.pop_back(); auto &it = m.find(nr)->second; for(auto &nbr: it) { if(dist[nbr] == -1) { dist[nbr] = dist[nr]+1; stck.push_back(nbr); } } } sort(order, order+n, srt); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); stringstream ss; int ssSize = 0; int a, b; cin >> n; cin >> ms; for(int i=0;i<ms;i++) { cin >> a >> b; connect(src, a, b); } cin >> md; for(int i=0;i<md;i++) { cin >> a >> b; connect(dest, a, b); } orderByDistance(src); auto &oneNeighbours = src.find(1)->second; for(int i=0;i<n;i++) { int nr = order[i]; if(nr == 1) continue; if(oneNeighbours.find(nr) == oneNeighbours.end()) { ss << "+ 1 " << nr << "\n"; ssSize++; } } for (auto &p: src) { int nr = p.first; if(nr == 1) continue; auto &destSet = dest.find(nr)->second; for(auto &nbr: p.second) { if(nbr == 1) continue; if(nbr > nr) { if(destSet.find(nbr) == destSet.end()) { ss << "- " << nr << " " << nbr << "\n"; ssSize++; } } } } for (auto &p: dest) { int nr = p.first; if(nr == 1) continue; auto &srcSet = src.find(nr)->second; for(auto &nbr: p.second) { if(nbr == 1) continue; if(nbr > nr) { if(srcSet.find(nbr) == srcSet.end()) { ss << "+ " << nr << " " << nbr << "\n"; ssSize++; } } } } orderByDistance(dest); oneNeighbours = dest.find(1)->second; for(int i=n-1;i>=0;i--) { int nr = order[i]; if(nr == 1) continue; if(oneNeighbours.find(nr) == oneNeighbours.end()) { ss << "- 1 " << nr << "\n"; ssSize++; } } cout << ssSize << "\n" << ss.str(); return 0; } |
English