#include<bits/stdc++.h> using namespace std; int n,m; vector<int> graph[200010]; set<int> masks; int sums[100]; void generate(int smask){ queue<int> que; que.push(smask); masks.insert(smask); int qmask,nmask; while(!que.empty()){ qmask = que.front(); que.pop(); for(int i = 0; i < n; i++){ for(int j : graph[i]){ if(((qmask >> i)&1) == ((qmask >> j)&1)){ // nmask = qmask - (qmask & (1 << i)) - (qmask & (1 << j)) + ((~qmask) & (1 << i)) - ((~qmask) & (1 << j)); nmask = qmask ^ ((1 << i) | (1 << j)); if(masks.find(nmask) == masks.end()){ que.push(nmask); masks.insert(nmask); } } } } } } void print_mask(int mask){ int sum = 0; for(int i = 0; i < n; i++){ cout << (1 & (mask >> i)) << " "; sum += (1 & (mask >> i)); } sums[sum]++; cout << " | " << sum << "\n"; } int main(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); cin >> n >> m; int smask = 0; int tmp; for(int i = 0; i < n; i++){ cin >> tmp; smask |= (tmp << i); } int a,b; for(int i = 0; i < m; i++){ cin >> a >> b; a--; b--; graph[min(a,b)].push_back(max(a,b)); // graph[b].push_back(a); } generate(smask); cout << masks.size() << "\n"; // for(int i : masks){ // // cout << i << " "; // print_mask(i); // } // for(int i = 0; i <= n; i++){ // if(!sums[i]) continue; // cout << i << ": " << sums[i] << "\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 | #include<bits/stdc++.h> using namespace std; int n,m; vector<int> graph[200010]; set<int> masks; int sums[100]; void generate(int smask){ queue<int> que; que.push(smask); masks.insert(smask); int qmask,nmask; while(!que.empty()){ qmask = que.front(); que.pop(); for(int i = 0; i < n; i++){ for(int j : graph[i]){ if(((qmask >> i)&1) == ((qmask >> j)&1)){ // nmask = qmask - (qmask & (1 << i)) - (qmask & (1 << j)) + ((~qmask) & (1 << i)) - ((~qmask) & (1 << j)); nmask = qmask ^ ((1 << i) | (1 << j)); if(masks.find(nmask) == masks.end()){ que.push(nmask); masks.insert(nmask); } } } } } } void print_mask(int mask){ int sum = 0; for(int i = 0; i < n; i++){ cout << (1 & (mask >> i)) << " "; sum += (1 & (mask >> i)); } sums[sum]++; cout << " | " << sum << "\n"; } int main(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); cin >> n >> m; int smask = 0; int tmp; for(int i = 0; i < n; i++){ cin >> tmp; smask |= (tmp << i); } int a,b; for(int i = 0; i < m; i++){ cin >> a >> b; a--; b--; graph[min(a,b)].push_back(max(a,b)); // graph[b].push_back(a); } generate(smask); cout << masks.size() << "\n"; // for(int i : masks){ // // cout << i << " "; // print_mask(i); // } // for(int i = 0; i <= n; i++){ // if(!sums[i]) continue; // cout << i << ": " << sums[i] << "\n"; // } return 0; } |