AtCoder ABC 002 D - 派閥 をbit全探索で理解したい
AtCoder Beginner Contest 002 - 派閥 にて、解法がわからなかったので解答の例を調べるもよく分からなかったため質問します。
問題:https://atcoder.jp/contests/abc002/tasks/abc002_4
以下、ネットの解答例を参考に作成したのですが、配列asが何なのか、as宣言後のforが何を示したいのか、asの要素数で二重ループをなぜ行なっているのでしょうか。
実装コード
c++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int n, m; cin >> n >> m; 6 vector<vector<int>> graph(12, vector<int>(12)); 7 8 for(int i = 0; i < m; i++){ //関係が存在する二次元配列にフラグ(1)を立てる 9 int x, y; cin >> x >>y; 10 x--; y--; // 配列は0スタートだから毎回デクリメント 11 graph[x][y] = 1; graph[y][x] = 1; 12 } 13 14 int ans = 1; 15 for(int mask = 0; mask < (1 << n); mask++){ 16 vector<int> as; 17 for(int i = 0; i < n; i++){ 18 if(1 & (mask >> i)) as.push_back(i); 19 } 20 21 bool ok = true; 22 for(auto i : as){ 23 for(auto j : as){ 24 if(i == j) continue; 25 if(graph[i][j] != 1) ok = false; 26 } 27 } 28 29 if(ok) ans = max(ans, (int)as.size()); 30 } 31 cout << ans << endl; 32} 33
具体的な不明部分
for(int i = 0; i < n; i++){ if(1 & (mask >> i)) as.push_back(i); } bool ok = true; for(auto i : as){ for(auto j : as){ if(i == j) continue; if(graph[i][j] != 1) ok = false; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/11 02:56
2020/12/11 17:19
2020/12/12 01:25 編集