#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
vector<vector<int>> wiazania(n);
vector<pair<int, int>> pary;
vector<pair<char, pair<int,int>>> output;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
a--; b--;
wiazania[a].push_back(b);
wiazania[b].push_back(a);
pary.push_back(make_pair(min(a, b), max(a, b)));
}
queue<int> kolejka;
stack<int> kolejnosc_dodanych;
vector<bool> dodane(n);
vector<bool> odwiedzone(n);
vector<bool> wypisane(n);
kolejka.push(0);
while (!kolejka.empty()) {
odwiedzone[kolejka.front()] = true;
for (int i = 0; i < wiazania[kolejka.front()].size(); i++) {
if (odwiedzone[wiazania[kolejka.front()][i]] == false) {
bool test = false;
for (int j = 0; j < wiazania[0].size(); j++) {
if (wiazania[0][j] == wiazania[kolejka.front()][i]) {
test = true;
break;
}
}
if (test == false && wypisane[wiazania[kolejka.front()][i]] == false) {
output.push_back(make_pair('+', make_pair(1, wiazania[kolejka.front()][i]+1)));
dodane[wiazania[kolejka.front()][i]] = true;
kolejnosc_dodanych.push(wiazania[kolejka.front()][i]);
wypisane[wiazania[kolejka.front()][i]] = true;
}
kolejka.push(wiazania[kolejka.front()][i]);
}
}
kolejka.pop();
}
vector<vector<int>> oczekiwane(n);
int o;
cin >> o;
for (int i = 0; i < o; i++) {
int a, b;
cin >> a >> b;
a--; b--;
oczekiwane[a].push_back(b);
oczekiwane[b].push_back(a);
bool test = false;
if (a == 0) {
dodane[b] = false;
} else if (b == 0) {
dodane[a] = false;
} else {
for (int j = 0; j < wiazania[a].size(); j++) {
if (wiazania[a][j] == b) {
test = true;
break;
}
}
if (test == false) {
output.push_back(make_pair('+', make_pair(a+1, b+1)));
if (a == 0) {
dodane[b] = false;
} else if (b == 0) {
dodane[a] = false;
}
}
}
}
for (int i = 0; i < m; i++) {
int a = pary[i].first, b = pary[i].second;
bool test = false;
for (int j = 0; j < oczekiwane[a].size(); j++) {
if (oczekiwane[a][j] == b) {
test = true;
break;
}
}
if (test == false) {
output.push_back(make_pair('-', make_pair(a+1, b+1)));
}
}
while (!kolejnosc_dodanych.empty()) {
if (dodane[kolejnosc_dodanych.top()] == true) {
output.push_back(make_pair('-', make_pair(1, kolejnosc_dodanych.top()+1)));
}
kolejnosc_dodanych.pop();
}
cout << output.size() << endl;
for (int i = 0; i < output.size(); i++) {
cout << output[i].first << " " << output[i].second.first << " " << output[i].second.second << 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 | #include <iostream> #include <vector> #include <queue> #include <stack> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m; cin >> n >> m; vector<vector<int>> wiazania(n); vector<pair<int, int>> pary; vector<pair<char, pair<int,int>>> output; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; wiazania[a].push_back(b); wiazania[b].push_back(a); pary.push_back(make_pair(min(a, b), max(a, b))); } queue<int> kolejka; stack<int> kolejnosc_dodanych; vector<bool> dodane(n); vector<bool> odwiedzone(n); vector<bool> wypisane(n); kolejka.push(0); while (!kolejka.empty()) { odwiedzone[kolejka.front()] = true; for (int i = 0; i < wiazania[kolejka.front()].size(); i++) { if (odwiedzone[wiazania[kolejka.front()][i]] == false) { bool test = false; for (int j = 0; j < wiazania[0].size(); j++) { if (wiazania[0][j] == wiazania[kolejka.front()][i]) { test = true; break; } } if (test == false && wypisane[wiazania[kolejka.front()][i]] == false) { output.push_back(make_pair('+', make_pair(1, wiazania[kolejka.front()][i]+1))); dodane[wiazania[kolejka.front()][i]] = true; kolejnosc_dodanych.push(wiazania[kolejka.front()][i]); wypisane[wiazania[kolejka.front()][i]] = true; } kolejka.push(wiazania[kolejka.front()][i]); } } kolejka.pop(); } vector<vector<int>> oczekiwane(n); int o; cin >> o; for (int i = 0; i < o; i++) { int a, b; cin >> a >> b; a--; b--; oczekiwane[a].push_back(b); oczekiwane[b].push_back(a); bool test = false; if (a == 0) { dodane[b] = false; } else if (b == 0) { dodane[a] = false; } else { for (int j = 0; j < wiazania[a].size(); j++) { if (wiazania[a][j] == b) { test = true; break; } } if (test == false) { output.push_back(make_pair('+', make_pair(a+1, b+1))); if (a == 0) { dodane[b] = false; } else if (b == 0) { dodane[a] = false; } } } } for (int i = 0; i < m; i++) { int a = pary[i].first, b = pary[i].second; bool test = false; for (int j = 0; j < oczekiwane[a].size(); j++) { if (oczekiwane[a][j] == b) { test = true; break; } } if (test == false) { output.push_back(make_pair('-', make_pair(a+1, b+1))); } } while (!kolejnosc_dodanych.empty()) { if (dodane[kolejnosc_dodanych.top()] == true) { output.push_back(make_pair('-', make_pair(1, kolejnosc_dodanych.top()+1))); } kolejnosc_dodanych.pop(); } cout << output.size() << endl; for (int i = 0; i < output.size(); i++) { cout << output[i].first << " " << output[i].second.first << " " << output[i].second.second << endl; } return 0; } |
English