#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define ll long long
int maxn=30003;
vector<vector<int>> v(maxn), vd(maxn);
vector<bool> pj(maxn);
vector<pair<bool, pair<int, int>>> ans;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, p, d;
cin >> N >> p;
for (int i=0; i<p; i++){
int a, b;
cin >> a >> b;
if (a>b) swap(a, b);
if (a==1) pj[b]=true;
v[b].push_back(a);
v[a].push_back(b);
}
cin >> d;
vector<pair<int, int>> bp;
for (int i=0; i<d; i++){
int a, b;
cin >> a >> b;
if (a>b) swap(a, b);
bool pr=false;
vd[b].push_back(a);
vd[a].push_back(b);
for (int j=0; j<v[a].size(); j++){
if (v[a][j]==b){
pr=true;
break;
}
}
if (!pr && a!=1) bp.push_back({a, b});
}
ll inf = 1e9+8;
vector<ll> dist(N+4, inf);
dist[1]=0;
priority_queue<pair<ll, ll>> que;
que.push({inf, 1});
while (que.size()>0){
pair<ll, ll> ww=que.top();
int u=ww.s;
que.pop();
for (int i=0; i<vd[u].size(); i++){
ll w=vd[u][i];
if (dist[u]+1<dist[w]){
dist[w]=dist[u]+1;
que.push({inf-dist[w], w});
}
}
}
for (int i=2; i<=N; i++){
if (!pj[i]){
v[i].push_back(1);
v[1].push_back(i);
ans.push_back({1, {1, i}});
}
}
for (auto i:bp){
ans.push_back({1, {i.f, i.s}});
}
for (int i=2; i<=N; i++){
for (int j=0; j<v[i].size(); j++){
int sz=v[i][j];
if (sz==1 || sz<i) continue;
// sprawdz czy sz jest w vd
bool pr=false;
for (int k=0; k<vd[i].size(); k++){
if (vd[i][k]==sz){
pr=true;
break;
}
}
if (!pr){
ans.push_back({0, {i, sz}});
}
}
}
vector<int> dous;
for (int j=0; j<v[1].size(); j++){
int sz=v[1][j];
// sprawdz czy sz jest w vd
bool pr=false;
for (int k=0; k<vd[1].size(); k++){
if (vd[1][k]==sz){
pr=true;
break;
}
}
if (!pr) dous.push_back(sz);
}
vector<pair<int, int>> ds;
for (auto i:dous){
ds.push_back({dist[i], i});
}
sort(ds.begin(), ds.end(), greater<pair<int, int>>());
for (auto i:ds){
ans.push_back({0, {1, i.s}});
}
cout << ans.size() << "\n";
for (auto i:ans){
if (i.f) cout << "+ ";
else cout << "- ";
cout << i.s.f << " " << i.s.s << "\n";
}
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 118 119 | #include <bits/stdc++.h> using namespace std; #define f first #define s second #define ll long long int maxn=30003; vector<vector<int>> v(maxn), vd(maxn); vector<bool> pj(maxn); vector<pair<bool, pair<int, int>>> ans; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, p, d; cin >> N >> p; for (int i=0; i<p; i++){ int a, b; cin >> a >> b; if (a>b) swap(a, b); if (a==1) pj[b]=true; v[b].push_back(a); v[a].push_back(b); } cin >> d; vector<pair<int, int>> bp; for (int i=0; i<d; i++){ int a, b; cin >> a >> b; if (a>b) swap(a, b); bool pr=false; vd[b].push_back(a); vd[a].push_back(b); for (int j=0; j<v[a].size(); j++){ if (v[a][j]==b){ pr=true; break; } } if (!pr && a!=1) bp.push_back({a, b}); } ll inf = 1e9+8; vector<ll> dist(N+4, inf); dist[1]=0; priority_queue<pair<ll, ll>> que; que.push({inf, 1}); while (que.size()>0){ pair<ll, ll> ww=que.top(); int u=ww.s; que.pop(); for (int i=0; i<vd[u].size(); i++){ ll w=vd[u][i]; if (dist[u]+1<dist[w]){ dist[w]=dist[u]+1; que.push({inf-dist[w], w}); } } } for (int i=2; i<=N; i++){ if (!pj[i]){ v[i].push_back(1); v[1].push_back(i); ans.push_back({1, {1, i}}); } } for (auto i:bp){ ans.push_back({1, {i.f, i.s}}); } for (int i=2; i<=N; i++){ for (int j=0; j<v[i].size(); j++){ int sz=v[i][j]; if (sz==1 || sz<i) continue; // sprawdz czy sz jest w vd bool pr=false; for (int k=0; k<vd[i].size(); k++){ if (vd[i][k]==sz){ pr=true; break; } } if (!pr){ ans.push_back({0, {i, sz}}); } } } vector<int> dous; for (int j=0; j<v[1].size(); j++){ int sz=v[1][j]; // sprawdz czy sz jest w vd bool pr=false; for (int k=0; k<vd[1].size(); k++){ if (vd[1][k]==sz){ pr=true; break; } } if (!pr) dous.push_back(sz); } vector<pair<int, int>> ds; for (auto i:dous){ ds.push_back({dist[i], i}); } sort(ds.begin(), ds.end(), greater<pair<int, int>>()); for (auto i:ds){ ans.push_back({0, {1, i.s}}); } cout << ans.size() << "\n"; for (auto i:ans){ if (i.f) cout << "+ "; else cout << "- "; cout << i.s.f << " " << i.s.s << "\n"; } return 0; } |
English