#include <string>
#include <iostream>
#include <set>
using namespace std;
enum State { unknown, present, missing };
constexpr const char StateToString(State e) throw() {
switch (e) {
case unknown: return '?';
case present: return '1';
case missing: return '0';
}
throw invalid_argument("Invalid state: " + e);
}
class Bajtoszyce
{
int N;
set<int>* adj;
State *status;
void makePresent(int x);
bool findCycle(int x, int end, int parent);
public:
Bajtoszyce(int n);
void delivery(int a, int b);
State query(int x);
void crash(int x);
};
Bajtoszyce::Bajtoszyce(int n) {
N = n;
adj = new set<int>[N];
status = new State[N]{missing,};
}
void Bajtoszyce::crash(int x) {
makePresent(x);
status[x] = missing;
}
void Bajtoszyce::delivery(int a, int b) {
if (a == b) {
makePresent(a);
return;
}
if (status[a] == present) {
makePresent(b);
return;
}
if (status[b] == present) {
makePresent(a);
return;
}
if (adj[a].find(b) != adj[a].end()) {
makePresent(a);
return;
}
adj[a].insert(b);
adj[b].insert(a);
status[a] = unknown;
status[b] = unknown;
if (findCycle(b, a, a)) {
makePresent(a);
}
}
State Bajtoszyce::query(int x) {
return status[x];
}
bool Bajtoszyce::findCycle(int x, int end, int parent) {
if (parent != end && adj[x].find(end) != adj[x].end()) {
return true;
}
for (auto it=adj[x].begin(); it!=adj[x].end(); ++it) {
if (*it != parent && findCycle(*it, end, x))
return true;
}
return false;
}
void Bajtoszyce::makePresent(int x) {
//cerr << "makePresent(" << x <<")" << endl;
status[x] = present;
set<int> t(adj[x]);
adj[x] = set<int>();
for (auto it=t.begin(); it!=t.end(); ++it) {
makePresent(*it);
}
}
int main() {
int n,q,x,y;
char c;
cin>>n>>q;
Bajtoszyce b = Bajtoszyce(n);
for (int i=0; i<q; ++i) {
cin >> c;
switch (c) {
case '?':
cin >> x;
//cerr << "query(" << x << ")" << endl;
cout << StateToString(b.query(x-1));
break;
case '+':
cin >> x >> y;
// << "delivery(" << x << "," << y << ")" << endl;
b.delivery(x-1,y-1);
break;
case '-':
cin >> x;
//cerr << "crash(" << x << ")" << endl;
b.crash(x-1);
break;
default:
throw invalid_argument("Invalid command: " + c);
break;
}
}
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 120 121 122 123 124 125 126 127 | #include <string> #include <iostream> #include <set> using namespace std; enum State { unknown, present, missing }; constexpr const char StateToString(State e) throw() { switch (e) { case unknown: return '?'; case present: return '1'; case missing: return '0'; } throw invalid_argument("Invalid state: " + e); } class Bajtoszyce { int N; set<int>* adj; State *status; void makePresent(int x); bool findCycle(int x, int end, int parent); public: Bajtoszyce(int n); void delivery(int a, int b); State query(int x); void crash(int x); }; Bajtoszyce::Bajtoszyce(int n) { N = n; adj = new set<int>[N]; status = new State[N]{missing,}; } void Bajtoszyce::crash(int x) { makePresent(x); status[x] = missing; } void Bajtoszyce::delivery(int a, int b) { if (a == b) { makePresent(a); return; } if (status[a] == present) { makePresent(b); return; } if (status[b] == present) { makePresent(a); return; } if (adj[a].find(b) != adj[a].end()) { makePresent(a); return; } adj[a].insert(b); adj[b].insert(a); status[a] = unknown; status[b] = unknown; if (findCycle(b, a, a)) { makePresent(a); } } State Bajtoszyce::query(int x) { return status[x]; } bool Bajtoszyce::findCycle(int x, int end, int parent) { if (parent != end && adj[x].find(end) != adj[x].end()) { return true; } for (auto it=adj[x].begin(); it!=adj[x].end(); ++it) { if (*it != parent && findCycle(*it, end, x)) return true; } return false; } void Bajtoszyce::makePresent(int x) { //cerr << "makePresent(" << x <<")" << endl; status[x] = present; set<int> t(adj[x]); adj[x] = set<int>(); for (auto it=t.begin(); it!=t.end(); ++it) { makePresent(*it); } } int main() { int n,q,x,y; char c; cin>>n>>q; Bajtoszyce b = Bajtoszyce(n); for (int i=0; i<q; ++i) { cin >> c; switch (c) { case '?': cin >> x; //cerr << "query(" << x << ")" << endl; cout << StateToString(b.query(x-1)); break; case '+': cin >> x >> y; // << "delivery(" << x << "," << y << ")" << endl; b.delivery(x-1,y-1); break; case '-': cin >> x; //cerr << "crash(" << x << ")" << endl; b.crash(x-1); break; default: throw invalid_argument("Invalid command: " + c); break; } } return 0; } |
English