#include <bits/stdc++.h>
using namespace std;
int n, m1, m2;
pair<int, int> a;
vector<int> graf[30000];
set<pair<int, int>> poczatek;
set<pair<int, int>> doDodania, doNiczego, doUsuniecia;
stack<pair<int, int>> doUsunieciaS;
bitset<30000> odw;
queue<pair<char, pair<int, int>>> doWypisania;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m1;
for (int i = 0; i < m1; i++)
{
cin >> a.first >> a.second;
if (a.first > a.second) swap(a.first, a.second);
a.first--;
a.second--;
poczatek.insert(a);
}
cin >> m2;
for (int i = 0; i < m2; i++)
{
cin >> a.first >> a.second;
if (a.first > a.second) swap(a.first, a.second);
a.first--;
a.second--;
if (poczatek.find(a) == poczatek.end()) doDodania.insert(a);
else doNiczego.insert(a);
}
for (auto para : poczatek)
{
if (doDodania.find(para) == doDodania.end() && doNiczego.find(para) == doNiczego.end())
doUsuniecia.insert(para);
}
/*
cout << '\n';
for (auto para : poczatek)
cout << para.first << ' ' << para.second << '\n';
cout << '\n';
for (auto para : doDodania)
cout << para.first << ' ' << para.second << '\n';
cout << '\n';
for (auto para : doNiczego)
cout << para.first << ' ' << para.second << '\n';
cout << '\n';
for (auto para : doUsuniecia)
cout << para.first << ' ' << para.second << '\n';
cout << '\n';
*/
for (auto para : poczatek)
{
graf[para.first].push_back(para.second);
graf[para.second].push_back(para.first);
}
for (auto para : doDodania)
{
for (int i = 0; i < n; i++) odw[i] = 0;
queue<pair<int, vector<int>>> q;
q.push({ para.first, {} });
odw[para.first] = true;
pair<int, vector<int>> curr;
while (true)
{
curr = q.front();
if (curr.first == para.second) break;
q.pop();
curr.second.push_back(curr.first);
for (int sasiad : graf[curr.first])
{
if (!odw[sasiad])
q.push({ sasiad, curr.second });
odw[sasiad] = true;
}
}
for (int i = 2; i < curr.second.size(); i++)
{
graf[para.first].push_back(curr.second[i]);
graf[curr.second[i]].push_back(para.first);
doUsunieciaS.push({ para.first, curr.second[i] });
//cout << "+ " << para.first + 1 << ' ' << curr.second[i] + 1 << '\n';
doWypisania.push({ '+', { para.first + 1, curr.second[i] + 1 } });
}
graf[para.first].push_back(para.second);
graf[para.second].push_back(para.first);
//cout << "+ " << para.first + 1 << ' ' << para.second + 1 << '\n';
doWypisania.push({ '+', { para.first + 1, para.second + 1 } });
}
for (auto para : doUsuniecia)
{
for (int i = 0; i < n; i++) odw[i] = 0;
queue<pair<int, vector<int>>> q;
q.push({ para.first, {} });
odw[para.first] = true;
pair<int, vector<int>> curr;
while (true)
{
curr = q.front();
//cout << "visiting " << curr.first << '\n';
if (curr.first == para.second) break;
q.pop();
curr.second.push_back(curr.first);
for (int sasiad : graf[curr.first])
{
if (sasiad == para.first && curr.first == para.second || sasiad == para.second && curr.first == para.first)
continue;
if (!odw[sasiad])
q.push({ sasiad, curr.second });
odw[sasiad] = true;
}
}
/*for (int i = 0; i < n; i++)
{
cout << i << ' ';
for (int sasiad : graf[i])
{
cout << sasiad << ' ';
}
cout << '\n';
}*/
//cout << curr.second[0] << ' ' << curr.second[1] << ' ' << curr.second[2] << '\n';
for (int i = 2; i < curr.second.size(); i++)
{
graf[para.first].push_back(curr.second[i]);
graf[curr.second[i]].push_back(para.first);
doUsunieciaS.push({ para.first, curr.second[i] });
//cout << "+ " << para.first + 1 << ' ' << curr.second[i] + 1 << '\n';
doWypisania.push({ '+', { para.first + 1, curr.second[i] + 1 } });
}
doUsunieciaS.push({ para.first, para.second });
}
while (!doUsunieciaS.empty())
{
auto usun = doUsunieciaS.top();
doUsunieciaS.pop();
//cout << "- " << usun.first + 1 << ' ' << usun.second + 1 << '\n';
doWypisania.push({ '-', { usun.first + 1, usun.second + 1 } });
}
cout << doWypisania.size() << '\n';
while (!doWypisania.empty())
{
auto wypisz = doWypisania.front();
doWypisania.pop();
cout << wypisz.first << ' ' << wypisz.second.first << ' ' << wypisz.second.second << '\n';
}
return 0;
}
/*
6
7
1 2
2 3
3 4
4 5
5 6
2 5
3 6
6
1 2
2 3
3 4
4 5
5 6
6 1
*/
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #include <bits/stdc++.h> using namespace std; int n, m1, m2; pair<int, int> a; vector<int> graf[30000]; set<pair<int, int>> poczatek; set<pair<int, int>> doDodania, doNiczego, doUsuniecia; stack<pair<int, int>> doUsunieciaS; bitset<30000> odw; queue<pair<char, pair<int, int>>> doWypisania; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m1; for (int i = 0; i < m1; i++) { cin >> a.first >> a.second; if (a.first > a.second) swap(a.first, a.second); a.first--; a.second--; poczatek.insert(a); } cin >> m2; for (int i = 0; i < m2; i++) { cin >> a.first >> a.second; if (a.first > a.second) swap(a.first, a.second); a.first--; a.second--; if (poczatek.find(a) == poczatek.end()) doDodania.insert(a); else doNiczego.insert(a); } for (auto para : poczatek) { if (doDodania.find(para) == doDodania.end() && doNiczego.find(para) == doNiczego.end()) doUsuniecia.insert(para); } /* cout << '\n'; for (auto para : poczatek) cout << para.first << ' ' << para.second << '\n'; cout << '\n'; for (auto para : doDodania) cout << para.first << ' ' << para.second << '\n'; cout << '\n'; for (auto para : doNiczego) cout << para.first << ' ' << para.second << '\n'; cout << '\n'; for (auto para : doUsuniecia) cout << para.first << ' ' << para.second << '\n'; cout << '\n'; */ for (auto para : poczatek) { graf[para.first].push_back(para.second); graf[para.second].push_back(para.first); } for (auto para : doDodania) { for (int i = 0; i < n; i++) odw[i] = 0; queue<pair<int, vector<int>>> q; q.push({ para.first, {} }); odw[para.first] = true; pair<int, vector<int>> curr; while (true) { curr = q.front(); if (curr.first == para.second) break; q.pop(); curr.second.push_back(curr.first); for (int sasiad : graf[curr.first]) { if (!odw[sasiad]) q.push({ sasiad, curr.second }); odw[sasiad] = true; } } for (int i = 2; i < curr.second.size(); i++) { graf[para.first].push_back(curr.second[i]); graf[curr.second[i]].push_back(para.first); doUsunieciaS.push({ para.first, curr.second[i] }); //cout << "+ " << para.first + 1 << ' ' << curr.second[i] + 1 << '\n'; doWypisania.push({ '+', { para.first + 1, curr.second[i] + 1 } }); } graf[para.first].push_back(para.second); graf[para.second].push_back(para.first); //cout << "+ " << para.first + 1 << ' ' << para.second + 1 << '\n'; doWypisania.push({ '+', { para.first + 1, para.second + 1 } }); } for (auto para : doUsuniecia) { for (int i = 0; i < n; i++) odw[i] = 0; queue<pair<int, vector<int>>> q; q.push({ para.first, {} }); odw[para.first] = true; pair<int, vector<int>> curr; while (true) { curr = q.front(); //cout << "visiting " << curr.first << '\n'; if (curr.first == para.second) break; q.pop(); curr.second.push_back(curr.first); for (int sasiad : graf[curr.first]) { if (sasiad == para.first && curr.first == para.second || sasiad == para.second && curr.first == para.first) continue; if (!odw[sasiad]) q.push({ sasiad, curr.second }); odw[sasiad] = true; } } /*for (int i = 0; i < n; i++) { cout << i << ' '; for (int sasiad : graf[i]) { cout << sasiad << ' '; } cout << '\n'; }*/ //cout << curr.second[0] << ' ' << curr.second[1] << ' ' << curr.second[2] << '\n'; for (int i = 2; i < curr.second.size(); i++) { graf[para.first].push_back(curr.second[i]); graf[curr.second[i]].push_back(para.first); doUsunieciaS.push({ para.first, curr.second[i] }); //cout << "+ " << para.first + 1 << ' ' << curr.second[i] + 1 << '\n'; doWypisania.push({ '+', { para.first + 1, curr.second[i] + 1 } }); } doUsunieciaS.push({ para.first, para.second }); } while (!doUsunieciaS.empty()) { auto usun = doUsunieciaS.top(); doUsunieciaS.pop(); //cout << "- " << usun.first + 1 << ' ' << usun.second + 1 << '\n'; doWypisania.push({ '-', { usun.first + 1, usun.second + 1 } }); } cout << doWypisania.size() << '\n'; while (!doWypisania.empty()) { auto wypisz = doWypisania.front(); doWypisania.pop(); cout << wypisz.first << ' ' << wypisz.second.first << ' ' << wypisz.second.second << '\n'; } return 0; } /* 6 7 1 2 2 3 3 4 4 5 5 6 2 5 3 6 6 1 2 2 3 3 4 4 5 5 6 6 1 */ |
English