#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <functional> #include <unordered_set> const long long MOD = 1'000'000'000 + 7; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cin.tie(0); int N, M; std::cin >> N >> M; std::vector<int> c(N); for(int i = 0; i < N; i++) { std::cin >> c[i]; } std::vector<std::vector<int>> G(N); for(int i = 0; i < M; i++) { int a, b; std::cin >> a >> b; a--; b--; G[a].push_back(b); G[b].push_back(a); } long long result = 1; std::queue<int> Q; std::vector<bool> visited(N); for(int i = 0; i < N; i++) { if(visited[i]) { continue; } std::vector<int> comp; Q.push(i); visited[i] = true; while(!Q.empty()) { int v = Q.front(); Q.pop(); comp.push_back(v); for(int u : G[v]) { if(!visited[u]) { visited[u] = true; Q.push(u); } } } std::sort(comp.begin(), comp.end()); auto id = [&](int v) { return std::lower_bound(comp.begin(), comp.end(), v) - comp.begin(); }; std::vector<std::pair<int, int>> switches; for(int v : comp) { for(int u : G[v]) { if(u < v) { switches.push_back({id(v), id(u)}); } } } int M = comp.size(); std::unordered_set<int> used; int initial = 0; for(int v : comp) { if(c[v] == 1) { initial |= 1 << id(v); } } Q.push(initial); used.insert(initial); long long cnt = 0; while(!Q.empty()) { int mask = Q.front(); Q.pop(); cnt++; for(auto [a, b] : switches) { if(((mask >> a) & 1) != ((mask >> b) & 1)) { continue; } int new_mask = mask ^ (1 << a) ^ (1 << b); if(used.count(new_mask) == 0) { used.insert(new_mask); Q.push(new_mask); } } } result = (result * cnt) % MOD; } std::cout << result << '\n'; 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 | #include <iostream> #include <vector> #include <queue> #include <algorithm> #include <functional> #include <unordered_set> const long long MOD = 1'000'000'000 + 7; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cin.tie(0); int N, M; std::cin >> N >> M; std::vector<int> c(N); for(int i = 0; i < N; i++) { std::cin >> c[i]; } std::vector<std::vector<int>> G(N); for(int i = 0; i < M; i++) { int a, b; std::cin >> a >> b; a--; b--; G[a].push_back(b); G[b].push_back(a); } long long result = 1; std::queue<int> Q; std::vector<bool> visited(N); for(int i = 0; i < N; i++) { if(visited[i]) { continue; } std::vector<int> comp; Q.push(i); visited[i] = true; while(!Q.empty()) { int v = Q.front(); Q.pop(); comp.push_back(v); for(int u : G[v]) { if(!visited[u]) { visited[u] = true; Q.push(u); } } } std::sort(comp.begin(), comp.end()); auto id = [&](int v) { return std::lower_bound(comp.begin(), comp.end(), v) - comp.begin(); }; std::vector<std::pair<int, int>> switches; for(int v : comp) { for(int u : G[v]) { if(u < v) { switches.push_back({id(v), id(u)}); } } } int M = comp.size(); std::unordered_set<int> used; int initial = 0; for(int v : comp) { if(c[v] == 1) { initial |= 1 << id(v); } } Q.push(initial); used.insert(initial); long long cnt = 0; while(!Q.empty()) { int mask = Q.front(); Q.pop(); cnt++; for(auto [a, b] : switches) { if(((mask >> a) & 1) != ((mask >> b) & 1)) { continue; } int new_mask = mask ^ (1 << a) ^ (1 << b); if(used.count(new_mask) == 0) { used.insert(new_mask); Q.push(new_mask); } } } result = (result * cnt) % MOD; } std::cout << result << '\n'; return 0; } |