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