#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; } |
English