#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
using ld = long double;
//#define int ll
#define sz(x) ((int)(x).size())
using pii = pair<int,int>;
using tii = tuple<int,int,int>;
struct Graph {
set<pii> edgs;
vector<vector<int>> g;
void init(int n) {
g.assign(n, vector<int>());
edgs.clear();
}
void add_edge(int a, int b) {
if(a > b) swap(a, b);
edgs.emplace(a, b);
g[a].emplace_back(b);
g[b].emplace_back(a);
}
bool query_edge(int a, int b) {
if(a > b) swap(a, b);
return a == b || edgs.count(pii{a, b});
}
vector<tuple<char, int, int>> clica_din1() {
queue<int> que;
int n = sz(g);
vector<int> occ(n, 0);
occ[1] = 1;
que.emplace(1);
vector<tuple<char, int, int>> opers;
while(!que.empty()) {
int node = que.front();
que.pop();
//cerr << node << '\t' << query_edge(1, node) << '\n';
if(!query_edge(1, node))
add_edge(1, node),
opers.emplace_back('+', 1, node);
for(auto x : g[node])
if(!occ[x])
que.emplace(x),
occ[x] = 1;
}
//cerr << "--\n";
return opers;
}
};
signed main() {
cin.tie(0) -> sync_with_stdio(0);
int n, m;
cin >> n;
Graph A, B;
A.init(n + 1);
B.init(n + 1);
cin >> m;
for(int i = 0, a, b; i < m; i++)
cin >> a >> b,
A.add_edge(a, b);
cin >> m;
for(int i = 0, a, b; i < m; i++)
cin >> a >> b,
B.add_edge(a, b);
auto first = A.clica_din1(), third = B.clica_din1();
for(auto &[a, b, c] : third) a = '-';
reverse(all(third));
vector<tuple<char, int, int>> second;
for(auto [a, b] : A.edgs) {
if(a == 1 || b == 1) continue;
if(!B.query_edge(a, b)) second.emplace_back('-', a , b);
}
for(auto [a, b] : B.edgs) {
if(a == 1 || b == 1) continue;
if(!A.query_edge(a, b)) second.emplace_back('+', a , b);
}
cout << sz(first) + sz(second) + sz(third) << '\n';
for(auto [a, b, c] : first) cout << a << ' ' << b << ' ' << c << '\n';
for(auto [a, b, c] : second) cout << a << ' ' << b << ' ' << c << '\n';
for(auto [a, b, c] : third) cout << a << ' ' << b << ' ' << c << '\n';
}
/**
Anul asta nu se da centroid
-- Rugaciunile mele
*/
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 | #include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; using ld = long double; //#define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; struct Graph { set<pii> edgs; vector<vector<int>> g; void init(int n) { g.assign(n, vector<int>()); edgs.clear(); } void add_edge(int a, int b) { if(a > b) swap(a, b); edgs.emplace(a, b); g[a].emplace_back(b); g[b].emplace_back(a); } bool query_edge(int a, int b) { if(a > b) swap(a, b); return a == b || edgs.count(pii{a, b}); } vector<tuple<char, int, int>> clica_din1() { queue<int> que; int n = sz(g); vector<int> occ(n, 0); occ[1] = 1; que.emplace(1); vector<tuple<char, int, int>> opers; while(!que.empty()) { int node = que.front(); que.pop(); //cerr << node << '\t' << query_edge(1, node) << '\n'; if(!query_edge(1, node)) add_edge(1, node), opers.emplace_back('+', 1, node); for(auto x : g[node]) if(!occ[x]) que.emplace(x), occ[x] = 1; } //cerr << "--\n"; return opers; } }; signed main() { cin.tie(0) -> sync_with_stdio(0); int n, m; cin >> n; Graph A, B; A.init(n + 1); B.init(n + 1); cin >> m; for(int i = 0, a, b; i < m; i++) cin >> a >> b, A.add_edge(a, b); cin >> m; for(int i = 0, a, b; i < m; i++) cin >> a >> b, B.add_edge(a, b); auto first = A.clica_din1(), third = B.clica_din1(); for(auto &[a, b, c] : third) a = '-'; reverse(all(third)); vector<tuple<char, int, int>> second; for(auto [a, b] : A.edgs) { if(a == 1 || b == 1) continue; if(!B.query_edge(a, b)) second.emplace_back('-', a , b); } for(auto [a, b] : B.edgs) { if(a == 1 || b == 1) continue; if(!A.query_edge(a, b)) second.emplace_back('+', a , b); } cout << sz(first) + sz(second) + sz(third) << '\n'; for(auto [a, b, c] : first) cout << a << ' ' << b << ' ' << c << '\n'; for(auto [a, b, c] : second) cout << a << ' ' << b << ' ' << c << '\n'; for(auto [a, b, c] : third) cout << a << ' ' << b << ' ' << c << '\n'; } /** Anul asta nu se da centroid -- Rugaciunile mele */ |
English