ferinの競プロ帳

競プロについてのメモ

SRM618 div1 easy Family

考えたこ

サンプルのグラフを書いてみると、parent1[i]とparent2[i]が2つの異なる値で分類できれば可能であると判定できそうなことに気づく。これはparent1[i]とparent2[i]をつないだグラフが2部グラフであるかどうか判定すればできる。提出したら通った。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef vector<int> VI;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define PB push_back

VI g[105];
int color[105];

bool dfs(int v, int c) {
  color[v] = c;
  for(int i: g[v]) {
    if(color[i] == c) return false;
    if(color[i] == 0 && !dfs(i, -c)) return false;
  }
  return true;
}

class Family {
   public:
   string isFamily(vector <int> p1, vector <int> p2)
  {
    int n = p1.size();
    REP(i, n) {
      if(p1[i] == -1) continue;
      g[p1[i]].PB(p2[i]);
      g[p2[i]].PB(p1[i]);
    }

    REP(i, n) {
      if(!color[i]) {
        if(!dfs(i, 1)) {
          return "Impossible";
        }
      }
    }
    return "Possible";
  }
};