#include <iostream> #include <vector> #include <algorithm> #include <map> #include <cmath> #include <unordered_map> #include <string> #include <queue> #include <deque> #include <set> #include <cstdlib> #include <ctime> #include<chrono> #include<thread> #include<iomanip> #include<fstream> #define ll long long #define pb push_back #define mp make_pair #define ff first #define ss second using namespace std; typedef struct answer { char znak; int wierzcholek1; int wierzcholek2; }; int main() { int n; cin >> n; vector <set <int>> poczatkowyGraf(n + 1); vector <set <int>> koncowyGraf(n + 1); vector <answer> ans; int m; cin >> m; int a, b; int maxKrawedzi = 0; int hyperWierzcholek = 0; for(int i = 0; i < m; i++) { cin >> a >> b; poczatkowyGraf[a].insert(b); poczatkowyGraf[b].insert(a); if(poczatkowyGraf[a].size() > maxKrawedzi) { maxKrawedzi = (int)poczatkowyGraf[a].size(); hyperWierzcholek = a; } if(poczatkowyGraf[b].size() > maxKrawedzi) { maxKrawedzi = (int)poczatkowyGraf[b].size(); hyperWierzcholek = b; } } cin >> m; for(int i = 0; i < m; i++) { cin >> a >> b; koncowyGraf[a].insert(b); koncowyGraf[b].insert(a); } //1 queue<int> wierzcholki; vector<bool> passedWierzcholek(n + 1); passedWierzcholek[hyperWierzcholek] = 1; for(auto it : poczatkowyGraf[hyperWierzcholek]) { wierzcholki.push(it); passedWierzcholek[it] = 1; } while(wierzcholki.size() > 0) { int wybranyWierzcholek = wierzcholki.front(); for(auto it : poczatkowyGraf[wybranyWierzcholek]) { if(!passedWierzcholek[it]) { wierzcholki.push(it); poczatkowyGraf[hyperWierzcholek].insert(it); poczatkowyGraf[it].insert(hyperWierzcholek); passedWierzcholek[it] = 1; ans.pb({'+', hyperWierzcholek, it}); } } wierzcholki.pop(); } //2 for(int i = 1; i <= n; i++) { if(i != hyperWierzcholek) { for(auto it : koncowyGraf[i]) { if(!poczatkowyGraf[i].count(it)) { poczatkowyGraf[i].insert(it); poczatkowyGraf[it].insert(i); ans.pb({'+', i, it}); } } } } //2.5 vector <pair <int,int>> sequence; for(int i = 1; i <= n; i++) { sequence.pb(mp(poczatkowyGraf[i].size(), i)); } sort(sequence.begin(), sequence.end()); //3 for(auto seq : sequence) { for(auto it : poczatkowyGraf[seq.second]) { if(!koncowyGraf[seq.second].count(it)) { koncowyGraf[seq.second].insert(it); koncowyGraf[it].insert(seq.second); ans.pb({'-', seq.second, it}); } } } cout << ans.size() << endl; for(int i = 0; i < ans.size(); i++) { cout << ans[i].znak << " " << ans[i].wierzcholek1 << " " << ans[i].wierzcholek2 << endl; } 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 | #include <iostream> #include <vector> #include <algorithm> #include <map> #include <cmath> #include <unordered_map> #include <string> #include <queue> #include <deque> #include <set> #include <cstdlib> #include <ctime> #include<chrono> #include<thread> #include<iomanip> #include<fstream> #define ll long long #define pb push_back #define mp make_pair #define ff first #define ss second using namespace std; typedef struct answer { char znak; int wierzcholek1; int wierzcholek2; }; int main() { int n; cin >> n; vector <set <int>> poczatkowyGraf(n + 1); vector <set <int>> koncowyGraf(n + 1); vector <answer> ans; int m; cin >> m; int a, b; int maxKrawedzi = 0; int hyperWierzcholek = 0; for(int i = 0; i < m; i++) { cin >> a >> b; poczatkowyGraf[a].insert(b); poczatkowyGraf[b].insert(a); if(poczatkowyGraf[a].size() > maxKrawedzi) { maxKrawedzi = (int)poczatkowyGraf[a].size(); hyperWierzcholek = a; } if(poczatkowyGraf[b].size() > maxKrawedzi) { maxKrawedzi = (int)poczatkowyGraf[b].size(); hyperWierzcholek = b; } } cin >> m; for(int i = 0; i < m; i++) { cin >> a >> b; koncowyGraf[a].insert(b); koncowyGraf[b].insert(a); } //1 queue<int> wierzcholki; vector<bool> passedWierzcholek(n + 1); passedWierzcholek[hyperWierzcholek] = 1; for(auto it : poczatkowyGraf[hyperWierzcholek]) { wierzcholki.push(it); passedWierzcholek[it] = 1; } while(wierzcholki.size() > 0) { int wybranyWierzcholek = wierzcholki.front(); for(auto it : poczatkowyGraf[wybranyWierzcholek]) { if(!passedWierzcholek[it]) { wierzcholki.push(it); poczatkowyGraf[hyperWierzcholek].insert(it); poczatkowyGraf[it].insert(hyperWierzcholek); passedWierzcholek[it] = 1; ans.pb({'+', hyperWierzcholek, it}); } } wierzcholki.pop(); } //2 for(int i = 1; i <= n; i++) { if(i != hyperWierzcholek) { for(auto it : koncowyGraf[i]) { if(!poczatkowyGraf[i].count(it)) { poczatkowyGraf[i].insert(it); poczatkowyGraf[it].insert(i); ans.pb({'+', i, it}); } } } } //2.5 vector <pair <int,int>> sequence; for(int i = 1; i <= n; i++) { sequence.pb(mp(poczatkowyGraf[i].size(), i)); } sort(sequence.begin(), sequence.end()); //3 for(auto seq : sequence) { for(auto it : poczatkowyGraf[seq.second]) { if(!koncowyGraf[seq.second].count(it)) { koncowyGraf[seq.second].insert(it); koncowyGraf[it].insert(seq.second); ans.pb({'-', seq.second, it}); } } } cout << ans.size() << endl; for(int i = 0; i < ans.size(); i++) { cout << ans[i].znak << " " << ans[i].wierzcholek1 << " " << ans[i].wierzcholek2 << endl; } return 0; } |