#include <iostream>
#include <vector>
#include <queue>
#include <string>
using namespace std;
const int N = 3000001;
bool hasComputer[N];
int n, q, a, b;
char operation;
string result;
bool isCycle(vector<vector<int>>& graph, int start) {
vector<bool> visited(graph.size(), false);
queue<pair<int, int>> q;
q.push({ start, -1 });
visited[start] = true;
while (!q.empty()) {
int current = q.front().first;
int parent = q.front().second;
q.pop();
for (int neighbor : graph[current]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push({ neighbor, current });
}
else if (neighbor != parent) {
return true;
}
}
}
return false;
}
bool isPartOfCycle(vector<vector<int>>& graph, int vertex) {
return isCycle(graph, vertex);
}
int main() {
cin >> n >> q;
vector<vector<int>> graph(n);
for (int i = 0; i < q; i++) {
cin >> operation;
if (operation == '?') {
cin >> a;
//Jesli napewno nie ma komputera
if (hasComputer[a] == 0) {
result += "0";
continue;
}
//Jesli jest czescia cyklu lub graniczy z cyklem
if (isPartOfCycle(graph, a)) {
result += "1";
continue;
}
//Nie wiemy
result += "?";
}
if (operation == '+') {
cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
hasComputer[a] = 1;
hasComputer[b] = 1;
}
if (operation == '-') {
cin >> a;
hasComputer[a] = 0;
}
}
cout << result;
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 | #include <iostream> #include <vector> #include <queue> #include <string> using namespace std; const int N = 3000001; bool hasComputer[N]; int n, q, a, b; char operation; string result; bool isCycle(vector<vector<int>>& graph, int start) { vector<bool> visited(graph.size(), false); queue<pair<int, int>> q; q.push({ start, -1 }); visited[start] = true; while (!q.empty()) { int current = q.front().first; int parent = q.front().second; q.pop(); for (int neighbor : graph[current]) { if (!visited[neighbor]) { visited[neighbor] = true; q.push({ neighbor, current }); } else if (neighbor != parent) { return true; } } } return false; } bool isPartOfCycle(vector<vector<int>>& graph, int vertex) { return isCycle(graph, vertex); } int main() { cin >> n >> q; vector<vector<int>> graph(n); for (int i = 0; i < q; i++) { cin >> operation; if (operation == '?') { cin >> a; //Jesli napewno nie ma komputera if (hasComputer[a] == 0) { result += "0"; continue; } //Jesli jest czescia cyklu lub graniczy z cyklem if (isPartOfCycle(graph, a)) { result += "1"; continue; } //Nie wiemy result += "?"; } if (operation == '+') { cin >> a >> b; graph[a].push_back(b); graph[b].push_back(a); hasComputer[a] = 1; hasComputer[b] = 1; } if (operation == '-') { cin >> a; hasComputer[a] = 0; } } cout << result; return 0; } |
English