#include <cstdio>
#include <utility>
#include <vector>
#include <unordered_set>
#include <cstdint>
#include <deque>
#include <iostream>
using namespace std;
int n,m;
#define MAX_N 200010
#define MAX_M 200010
int state[MAX_N];
pair<int, int> prze[MAX_M];
__uint128_t M[MAX_M];
__uint128_t one = 1;
namespace std {
template<>
struct hash<__uint128_t> {
size_t operator()(__uint128_t var) const {
return std::hash<uint64_t>{}((uint64_t)var ^ (uint64_t)(var >> 64));
}
};
}
int main() {
scanf("%d %d", &n ,&m);
for(int i=0;i<n;i++) scanf("%d", &state[i]);
for(int i=0;i<m;i++) scanf("%d %d", &prze[i].first, &prze[i].second);
for(int i=0;i<m;i++) {
M[i]=(one << (prze[i].first-1)) | (one << (prze[i].second -1));
}
__uint128_t s = 0;
unordered_set<__uint128_t> visited;
deque<__uint128_t> queue;
for(int i=0;i<n;i++) {
if (state[i]) s|=(one << i);
}
queue.push_back(s);
while (!queue.empty()) {
int size = queue.size();
for(int i=0;i<size;i++) {
auto s = queue.front();
queue.pop_front();
if (visited.count(s)) continue;
visited.insert(s);
for(int i=0;i<m;i++) {
if((M[i] & s) == 0 || (M[i] & s) == M[i]) queue.push_back(s^M[i]);
}
}
}
cout << visited.size() << "\n";
}
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 | #include <cstdio> #include <utility> #include <vector> #include <unordered_set> #include <cstdint> #include <deque> #include <iostream> using namespace std; int n,m; #define MAX_N 200010 #define MAX_M 200010 int state[MAX_N]; pair<int, int> prze[MAX_M]; __uint128_t M[MAX_M]; __uint128_t one = 1; namespace std { template<> struct hash<__uint128_t> { size_t operator()(__uint128_t var) const { return std::hash<uint64_t>{}((uint64_t)var ^ (uint64_t)(var >> 64)); } }; } int main() { scanf("%d %d", &n ,&m); for(int i=0;i<n;i++) scanf("%d", &state[i]); for(int i=0;i<m;i++) scanf("%d %d", &prze[i].first, &prze[i].second); for(int i=0;i<m;i++) { M[i]=(one << (prze[i].first-1)) | (one << (prze[i].second -1)); } __uint128_t s = 0; unordered_set<__uint128_t> visited; deque<__uint128_t> queue; for(int i=0;i<n;i++) { if (state[i]) s|=(one << i); } queue.push_back(s); while (!queue.empty()) { int size = queue.size(); for(int i=0;i<size;i++) { auto s = queue.front(); queue.pop_front(); if (visited.count(s)) continue; visited.insert(s); for(int i=0;i<m;i++) { if((M[i] & s) == 0 || (M[i] & s) == M[i]) queue.push_back(s^M[i]); } } } cout << visited.size() << "\n"; } |
English