#include<bits/stdc++.h>
using namespace std;
using LL=long long;
#define FOR(i,l,r)for(int i=(l);i<=(r);++i)
#define REP(i,n)FOR(i,0,(n)-1)
#define ssize(x)int(x.size())
#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto&operator<<(auto&o,tuple<auto,auto,auto>p){return o<<"("<<get<0>(p)<<", "<<get<1>(p)<<", "<<get<2>(p)<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, ms, md;
cin >> n >> ms;
vector<vector<int>> graph(n);
set<pair<int, int>> ini_edges, fin_edges;
REP (i, ms) {
int u, v;
cin >> u >> v;
--u;
--v;
if (u > v)
swap(u, v);
ini_edges.emplace(u, v);
graph[u].emplace_back(v);
graph[v].emplace_back(u);
}
vector<tuple<int, int, int>> ans;
{
vector<int> odw(n);
function<void(int)> dfs = [&](int v) {
odw[v] = 1;
for (int u : graph[v])
if (!odw[u]) {
if (v && !ini_edges.count(pair(0, u)))
ans.emplace_back(1, 0, u);
dfs(u);
}
};
dfs(0);
}
debug(ans);
vector<int> to_erase(n, 1);
to_erase[0] = 0;
vector<vector<int>> ngraph(n);
cin >> md;
REP (i, md) {
int u, v;
cin >> u >> v;
--u;
--v;
if (u > v)
swap(u, v);
ngraph[u].emplace_back(v);
ngraph[v].emplace_back(u);
fin_edges.emplace(u, v);
if (u == 0)
to_erase[v] = 0;
else if (!ini_edges.count(pair(u, v)))
ans.emplace_back(1, u, v);
}
for (auto [u, v] : ini_edges) {
if (!u)
continue;
if (!fin_edges.count(pair(u, v)))
ans.emplace_back(-1, u, v);
}
vector<int> odw(n);
function<void(int)> dfs = [&](int v) {
odw[v] = 1;
for (int u : ngraph[v])
if (!odw[u])
dfs(u);
if (v && !fin_edges.count(pair(0, v)))
ans.emplace_back(-1, 0, v);
};
dfs(0);
cout << ssize(ans) << '\n';
for (auto [type, u, v] : ans) {
if (type == -1)
cout << '-';
else
cout << '+';
cout << ' ' << u + 1 << ' ' << v + 1 << '\n';
}
}
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 | #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto&operator<<(auto&o,tuple<auto,auto,auto>p){return o<<"("<<get<0>(p)<<", "<<get<1>(p)<<", "<<get<2>(p)<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif int main() { cin.tie(0)->sync_with_stdio(0); int n, ms, md; cin >> n >> ms; vector<vector<int>> graph(n); set<pair<int, int>> ini_edges, fin_edges; REP (i, ms) { int u, v; cin >> u >> v; --u; --v; if (u > v) swap(u, v); ini_edges.emplace(u, v); graph[u].emplace_back(v); graph[v].emplace_back(u); } vector<tuple<int, int, int>> ans; { vector<int> odw(n); function<void(int)> dfs = [&](int v) { odw[v] = 1; for (int u : graph[v]) if (!odw[u]) { if (v && !ini_edges.count(pair(0, u))) ans.emplace_back(1, 0, u); dfs(u); } }; dfs(0); } debug(ans); vector<int> to_erase(n, 1); to_erase[0] = 0; vector<vector<int>> ngraph(n); cin >> md; REP (i, md) { int u, v; cin >> u >> v; --u; --v; if (u > v) swap(u, v); ngraph[u].emplace_back(v); ngraph[v].emplace_back(u); fin_edges.emplace(u, v); if (u == 0) to_erase[v] = 0; else if (!ini_edges.count(pair(u, v))) ans.emplace_back(1, u, v); } for (auto [u, v] : ini_edges) { if (!u) continue; if (!fin_edges.count(pair(u, v))) ans.emplace_back(-1, u, v); } vector<int> odw(n); function<void(int)> dfs = [&](int v) { odw[v] = 1; for (int u : ngraph[v]) if (!odw[u]) dfs(u); if (v && !fin_edges.count(pair(0, v))) ans.emplace_back(-1, 0, v); }; dfs(0); cout << ssize(ans) << '\n'; for (auto [type, u, v] : ans) { if (type == -1) cout << '-'; else cout << '+'; cout << ' ' << u + 1 << ' ' << v + 1 << '\n'; } } |
English