// PA2024 runda 5C - https://sio2.mimuw.edu.pl/c/pa-2024-1/p/zar/
//-std=c++20
#include<iostream>
#include <cstddef>
#include <algorithm>
#include<vector>
#include <random> // Added for random number generation
#include <list>
#include<map>
using I = int64_t;
using namespace std;
struct Vertex {
int8_t state;
list<Vertex *> edges;
I sub_graph_no = 0;
bool xor_visited = false;
bool blocked() {
bool blocked = true;
for (const auto &v: edges) {
blocked = blocked && v->state != state;
}
return blocked;
}
};
struct Task {
I v, e;
vector<Vertex> vertexes;
vector<Vertex *> subgraphs;
vector<I> subgraph_sizes;
vector<bool> subgraph_valid;
void run() {
input_data();
calculate_subgraphs();
calculate_validity();
I result = 1;
for (I i = 0; i < subgraphs.size(); ++i) {
if (subgraph_valid[i]) {
for (I j = 1; j <= subgraph_sizes[i] - 1; j++) {
result = (result * 2) % 1'000'000'007;
}
}
}
cout << result<<'\n';
}
void calculate_validity() {
subgraph_valid.resize(subgraphs.size());
for (I i = 0; i < subgraphs.size(); i++) {
subgraph_valid[i] = !traverse_blocked(subgraphs[i]);
}
}
bool traverse_blocked(Vertex *vertex) {
bool blocked = vertex->blocked();
vertex->xor_visited = true;
for (const auto &item: vertex->edges) {
if (!item->xor_visited) {
blocked &= traverse_blocked(item);
}
}
return blocked;
}
void calculate_subgraphs() {
I sub_graph_counter = 0;
auto it = vertexes.begin();
while (it != vertexes.end()) {
if (it->sub_graph_no == 0) {
Vertex *vertex = &(*it);
sub_graph_counter++;
I size = traverse_subgraph(vertex, sub_graph_counter);
subgraphs.push_back(vertex);
subgraph_sizes.push_back(size);
}
it++;
}
}
I traverse_subgraph(Vertex *vertex, I s) {
vertex->sub_graph_no = s;
I size = 1;
for (const auto &item: vertex->edges) {
if (item->sub_graph_no == 0) {
size += traverse_subgraph(item, s);
}
}
return size;
}
void input_data() {
cin >> v >> e;
vertexes.resize(v);
for (int i = 0; i < v; i++) {
int x;
cin >> x;
if (x) {
vertexes[i].state = 1;
} else {
vertexes[i].state = -1;
}
}
for (int i = 0; i < e; ++i) {
I x, y;
cin >> x >> y;
x--;
y--;
vertexes[x].edges.push_back(&vertexes[y]);
vertexes[y].edges.push_back(&vertexes[x]);
}
}
};
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
Task x;
x.run();
}
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 | // PA2024 runda 5C - https://sio2.mimuw.edu.pl/c/pa-2024-1/p/zar/ //-std=c++20 #include<iostream> #include <cstddef> #include <algorithm> #include<vector> #include <random> // Added for random number generation #include <list> #include<map> using I = int64_t; using namespace std; struct Vertex { int8_t state; list<Vertex *> edges; I sub_graph_no = 0; bool xor_visited = false; bool blocked() { bool blocked = true; for (const auto &v: edges) { blocked = blocked && v->state != state; } return blocked; } }; struct Task { I v, e; vector<Vertex> vertexes; vector<Vertex *> subgraphs; vector<I> subgraph_sizes; vector<bool> subgraph_valid; void run() { input_data(); calculate_subgraphs(); calculate_validity(); I result = 1; for (I i = 0; i < subgraphs.size(); ++i) { if (subgraph_valid[i]) { for (I j = 1; j <= subgraph_sizes[i] - 1; j++) { result = (result * 2) % 1'000'000'007; } } } cout << result<<'\n'; } void calculate_validity() { subgraph_valid.resize(subgraphs.size()); for (I i = 0; i < subgraphs.size(); i++) { subgraph_valid[i] = !traverse_blocked(subgraphs[i]); } } bool traverse_blocked(Vertex *vertex) { bool blocked = vertex->blocked(); vertex->xor_visited = true; for (const auto &item: vertex->edges) { if (!item->xor_visited) { blocked &= traverse_blocked(item); } } return blocked; } void calculate_subgraphs() { I sub_graph_counter = 0; auto it = vertexes.begin(); while (it != vertexes.end()) { if (it->sub_graph_no == 0) { Vertex *vertex = &(*it); sub_graph_counter++; I size = traverse_subgraph(vertex, sub_graph_counter); subgraphs.push_back(vertex); subgraph_sizes.push_back(size); } it++; } } I traverse_subgraph(Vertex *vertex, I s) { vertex->sub_graph_no = s; I size = 1; for (const auto &item: vertex->edges) { if (item->sub_graph_no == 0) { size += traverse_subgraph(item, s); } } return size; } void input_data() { cin >> v >> e; vertexes.resize(v); for (int i = 0; i < v; i++) { int x; cin >> x; if (x) { vertexes[i].state = 1; } else { vertexes[i].state = -1; } } for (int i = 0; i < e; ++i) { I x, y; cin >> x >> y; x--; y--; vertexes[x].edges.push_back(&vertexes[y]); vertexes[y].edges.push_back(&vertexes[x]); } } }; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); Task x; x.run(); } |
English