Problem 1015 : Dominating Set

Problem G: Dominating Set
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1015

  • 問題概要

グラフが与えられる。
ノードを黒と白で塗る。
すべてのノードが

1 隣接するノードのうちひとつ以上が黒いノード
2 自分自身が黒いノード

のどちらかを満たすようなとき、最小の黒の数を求めよ。

  • 解法

全探索。
サイズが書いてないから不安だった。

  • ソース 
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)

using namespace std;

class Node{
public:
  bool black;
  vector<int> E;
  Node(){
    black = false;
  }
  bool ok(const vector<Node> &n){
    if(black)return true;
    FOR(it, E){
      if(n[(*it)].black)return true;
    }
    return false;
  }
};

int ans;

inline void search(int now, int cost,  vector<Node> &n){
  if(cost >= ans)return;
  if(now == n.size()){
    bool end = true;
    FOR(it, n)if(!(*it).ok(n))end = false;
    if(end) ans = min(ans, cost);
    return;
  }
  search(now+1, cost, n);
  if(ans == cost)return;
  n[now].black = true;
  search(now+1, cost+1, n);
  n[now].black = false; 
}


main(){
  int N, E;
  while(cin >> N >> E){
    if( N + E == 0)break;
    ans = 1000000000;
    vector<Node> n(N);
    rep(i, E){
      int p1, p2;
      cin >> p1 >> p2;
      n[p1].E.push_back(p2);
      n[p2].E.push_back(p1);
    }
    int now = 0, cost  = 0;
    search(now, cost, n);
    cout << ans << endl;
  }
}