#include <bits/stdc++.h> using namespace std; struct wierzcholek{ vector<int>krawedzie; vector<int>dodac; bool odwiedzony = false; }; vector<int> BFS(vector<wierzcholek>&v1); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n,m,a,b,suma=0; cin >> n >> m; vector<wierzcholek>v1(n+1); vector<wierzcholek>v2(n+1); for(int i=0; i<m; i++){ cin >> a >> b; v1[a].krawedzie.push_back(b); v1[b].krawedzie.push_back(a); } cin >> m; for(int i=0; i<m; i++){ cin >> a >> b; v2[a].krawedzie.push_back(b); v2[b].krawedzie.push_back(a); } int p1,p2; for(int i=2; i<=n; i++){ sort(v1[i].krawedzie.begin(),v1[i].krawedzie.end()); sort(v2[i].krawedzie.begin(),v2[i].krawedzie.end()); p1=0; p2=0; while(p1<v1[i].krawedzie.size() && p2<v2[i].krawedzie.size()){ if(v1[i].krawedzie[p1]>v2[i].krawedzie[p2]){ if((v2[i].krawedzie[p2]!=1) && (i>v2[i].krawedzie[p2])){ v1[i].dodac.push_back(v2[i].krawedzie[p2]); } p2++; }else{ if(v1[i].krawedzie[p1]==v2[i].krawedzie[p2]){ p1++; p2++; }else{ if((v1[i].krawedzie[p1]!=1) && (i>v1[i].krawedzie[p1])){ v2[i].dodac.push_back(v1[i].krawedzie[p1]); } p1++; } } } if(p1<v1[i].krawedzie.size()){ for(int j=p1; j<v1[i].krawedzie.size();j++){ if((v1[i].krawedzie[j]!=1) && (i>v1[i].krawedzie[j])){ v2[i].dodac.push_back(v1[i].krawedzie[j]); } } } if(p2<v2[i].krawedzie.size()){ for(int j=p2; j<v2[i].krawedzie.size();j++){ if((v2[i].krawedzie[j]!=1) && (i>v2[i].krawedzie[j])){ v1[i].dodac.push_back(v2[i].krawedzie[j]); } } } suma+=v1[i].dodac.size(); suma+=v2[i].dodac.size(); } vector<int> wynik1 = BFS(v1); suma+=wynik1.size(); vector<int> wynik2 = BFS(v2); suma+=wynik2.size(); cout << suma << endl; for(int i=0; i<wynik1.size();i++){ cout << "+" << " " << "1" << " " << wynik1[i] << endl; } for(int i=1; i<=n; i++){ for(int j=0; j<v1[i].dodac.size();j++){ cout << "+" << " " << i << " " << v1[i].dodac[j] << endl; } } for(int i=1; i<=n; i++){ for(int j=0; j<v2[i].dodac.size();j++){ cout << "-" << " " << i << " " << v2[i].dodac[j] << endl; } } for(int i=(wynik2.size()-1); i>=0;i--){ cout << "-" << " " << "1" << " " << wynik2[i] << endl; } return 0; } vector<int> BFS(vector<wierzcholek>&v){ vector<int>wynik; queue<int>kolejka; int w; v[1].odwiedzony = true; for(int i=0; i<v[1].krawedzie.size();i++){ if(!v[v[1].krawedzie[i]].odwiedzony){ v[v[1].krawedzie[i]].odwiedzony = true; kolejka.push(v[1].krawedzie[i]); } } while(!kolejka.empty()){ w = kolejka.front(); kolejka.pop(); for(int i=0; i<v[w].krawedzie.size();i++){ if(!v[v[w].krawedzie[i]].odwiedzony){ v[v[w].krawedzie[i]].odwiedzony = true; wynik.push_back(v[w].krawedzie[i]); kolejka.push(v[w].krawedzie[i]); } } } return wynik; }
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 | #include <bits/stdc++.h> using namespace std; struct wierzcholek{ vector<int>krawedzie; vector<int>dodac; bool odwiedzony = false; }; vector<int> BFS(vector<wierzcholek>&v1); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n,m,a,b,suma=0; cin >> n >> m; vector<wierzcholek>v1(n+1); vector<wierzcholek>v2(n+1); for(int i=0; i<m; i++){ cin >> a >> b; v1[a].krawedzie.push_back(b); v1[b].krawedzie.push_back(a); } cin >> m; for(int i=0; i<m; i++){ cin >> a >> b; v2[a].krawedzie.push_back(b); v2[b].krawedzie.push_back(a); } int p1,p2; for(int i=2; i<=n; i++){ sort(v1[i].krawedzie.begin(),v1[i].krawedzie.end()); sort(v2[i].krawedzie.begin(),v2[i].krawedzie.end()); p1=0; p2=0; while(p1<v1[i].krawedzie.size() && p2<v2[i].krawedzie.size()){ if(v1[i].krawedzie[p1]>v2[i].krawedzie[p2]){ if((v2[i].krawedzie[p2]!=1) && (i>v2[i].krawedzie[p2])){ v1[i].dodac.push_back(v2[i].krawedzie[p2]); } p2++; }else{ if(v1[i].krawedzie[p1]==v2[i].krawedzie[p2]){ p1++; p2++; }else{ if((v1[i].krawedzie[p1]!=1) && (i>v1[i].krawedzie[p1])){ v2[i].dodac.push_back(v1[i].krawedzie[p1]); } p1++; } } } if(p1<v1[i].krawedzie.size()){ for(int j=p1; j<v1[i].krawedzie.size();j++){ if((v1[i].krawedzie[j]!=1) && (i>v1[i].krawedzie[j])){ v2[i].dodac.push_back(v1[i].krawedzie[j]); } } } if(p2<v2[i].krawedzie.size()){ for(int j=p2; j<v2[i].krawedzie.size();j++){ if((v2[i].krawedzie[j]!=1) && (i>v2[i].krawedzie[j])){ v1[i].dodac.push_back(v2[i].krawedzie[j]); } } } suma+=v1[i].dodac.size(); suma+=v2[i].dodac.size(); } vector<int> wynik1 = BFS(v1); suma+=wynik1.size(); vector<int> wynik2 = BFS(v2); suma+=wynik2.size(); cout << suma << endl; for(int i=0; i<wynik1.size();i++){ cout << "+" << " " << "1" << " " << wynik1[i] << endl; } for(int i=1; i<=n; i++){ for(int j=0; j<v1[i].dodac.size();j++){ cout << "+" << " " << i << " " << v1[i].dodac[j] << endl; } } for(int i=1; i<=n; i++){ for(int j=0; j<v2[i].dodac.size();j++){ cout << "-" << " " << i << " " << v2[i].dodac[j] << endl; } } for(int i=(wynik2.size()-1); i>=0;i--){ cout << "-" << " " << "1" << " " << wynik2[i] << endl; } return 0; } vector<int> BFS(vector<wierzcholek>&v){ vector<int>wynik; queue<int>kolejka; int w; v[1].odwiedzony = true; for(int i=0; i<v[1].krawedzie.size();i++){ if(!v[v[1].krawedzie[i]].odwiedzony){ v[v[1].krawedzie[i]].odwiedzony = true; kolejka.push(v[1].krawedzie[i]); } } while(!kolejka.empty()){ w = kolejka.front(); kolejka.pop(); for(int i=0; i<v[w].krawedzie.size();i++){ if(!v[v[w].krawedzie[i]].odwiedzony){ v[v[w].krawedzie[i]].odwiedzony = true; wynik.push_back(v[w].krawedzie[i]); kolejka.push(v[w].krawedzie[i]); } } } return wynik; } |