#include <cstdio>
#include <queue>
#include <set>
#include <algorithm>
void getDepth(int start, const std::vector<std::vector<int> > &edges, std::vector<int> &depth) {
std::queue<int> q;
depth.resize(edges.size());
for (int n=1; n<edges.size(); n++) {
depth[n] = -1;
}
depth[start] = 0;
q.push(start);
while (!q.empty()) {
int v = q.front();
q.pop();
for (int n : edges[v]) {
if (depth[n] == -1) {
depth[n] = depth[v] + 1;
q.push(n);
}
}
}
}
void convert(const std::vector<int> &depth, std::vector<std::pair<int, int> > &pairs) {
for (int i=1; i<depth.size(); ++i) {
pairs.push_back(std::make_pair(depth[i], i));
}
}
int main() {
std::vector<std::vector<int> > source, target;
std::set<std::pair<int, int > > scheck, tcheck;
int N;
int m;
scanf("%d", &N);
source.resize(N+1);
target.resize(N+1);
scanf("%d", &m);
for (int i=0; i<m; ++i) {
int a,b;
scanf("%d %d", &a, &b);
source[a].push_back(b);
source[b].push_back(a);
scheck.insert(std::make_pair(a, b));
scheck.insert(std::make_pair(b, a));
}
scanf("%d", &m);
for (int i=0; i<m; ++i) {
int a,b;
scanf("%d %d", &a, &b);
target[a].push_back(b);
target[b].push_back(a);
tcheck.insert(std::make_pair(a, b));
tcheck.insert(std::make_pair(b, a));
}
std::vector<int> sdepth;
std::vector<int> tdepth;
getDepth(1, source, sdepth);
getDepth(1, target, tdepth);
std::vector<std::pair<int, int> > spairs;
std::vector<std::pair<int, int> > tpairs;
convert(sdepth, spairs);
convert(tdepth, tpairs);
std::sort(spairs.begin(), spairs.end());
std::sort(tpairs.begin(), tpairs.end(), std::greater<std::pair<int, int> >());
std::vector<std::pair<int, int> > result1;
std::vector<std::pair<int, int> > result2;
for (auto &pair : spairs) {
if (pair.first > 1) {
result1.push_back(std::make_pair(1, pair.second));
}
}
for (int v = 2; v <= N; v++) {
for (int n: target[v]) {
if (n > v && scheck.find(std::make_pair(v,n)) == scheck.end()) {
result1.push_back(std::make_pair(v, n));
}
}
}
for (int v = 2; v <= N; v++) {
for (int n: source[v]) {
if (n > v && tcheck.find(std::make_pair(v,n)) == tcheck.end()) {
result2.push_back(std::make_pair(v, n));
}
}
}
for (auto &pair : tpairs) {
if (pair.first > 1) {
result2.push_back(std::make_pair(1, pair.second));
}
}
printf("%d\n", (int)(result1.size() + result2.size()));
for (auto p : result1) {
printf("+ %d %d\n", p.first, p.second);
}
for (auto p : result2) {
printf("- %d %d\n", p.first, p.second);
}
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 | #include <cstdio> #include <queue> #include <set> #include <algorithm> void getDepth(int start, const std::vector<std::vector<int> > &edges, std::vector<int> &depth) { std::queue<int> q; depth.resize(edges.size()); for (int n=1; n<edges.size(); n++) { depth[n] = -1; } depth[start] = 0; q.push(start); while (!q.empty()) { int v = q.front(); q.pop(); for (int n : edges[v]) { if (depth[n] == -1) { depth[n] = depth[v] + 1; q.push(n); } } } } void convert(const std::vector<int> &depth, std::vector<std::pair<int, int> > &pairs) { for (int i=1; i<depth.size(); ++i) { pairs.push_back(std::make_pair(depth[i], i)); } } int main() { std::vector<std::vector<int> > source, target; std::set<std::pair<int, int > > scheck, tcheck; int N; int m; scanf("%d", &N); source.resize(N+1); target.resize(N+1); scanf("%d", &m); for (int i=0; i<m; ++i) { int a,b; scanf("%d %d", &a, &b); source[a].push_back(b); source[b].push_back(a); scheck.insert(std::make_pair(a, b)); scheck.insert(std::make_pair(b, a)); } scanf("%d", &m); for (int i=0; i<m; ++i) { int a,b; scanf("%d %d", &a, &b); target[a].push_back(b); target[b].push_back(a); tcheck.insert(std::make_pair(a, b)); tcheck.insert(std::make_pair(b, a)); } std::vector<int> sdepth; std::vector<int> tdepth; getDepth(1, source, sdepth); getDepth(1, target, tdepth); std::vector<std::pair<int, int> > spairs; std::vector<std::pair<int, int> > tpairs; convert(sdepth, spairs); convert(tdepth, tpairs); std::sort(spairs.begin(), spairs.end()); std::sort(tpairs.begin(), tpairs.end(), std::greater<std::pair<int, int> >()); std::vector<std::pair<int, int> > result1; std::vector<std::pair<int, int> > result2; for (auto &pair : spairs) { if (pair.first > 1) { result1.push_back(std::make_pair(1, pair.second)); } } for (int v = 2; v <= N; v++) { for (int n: target[v]) { if (n > v && scheck.find(std::make_pair(v,n)) == scheck.end()) { result1.push_back(std::make_pair(v, n)); } } } for (int v = 2; v <= N; v++) { for (int n: source[v]) { if (n > v && tcheck.find(std::make_pair(v,n)) == tcheck.end()) { result2.push_back(std::make_pair(v, n)); } } } for (auto &pair : tpairs) { if (pair.first > 1) { result2.push_back(std::make_pair(1, pair.second)); } } printf("%d\n", (int)(result1.size() + result2.size())); for (auto p : result1) { printf("+ %d %d\n", p.first, p.second); } for (auto p : result2) { printf("- %d %d\n", p.first, p.second); } return 0; } |
English