Cod sursa(job #2473807)

Utilizator stormy_weatherelena cristina stormy_weather Data 14 octombrie 2019 12:22:10
Problema Copii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;

bool valid_config(vector<vector <int>> &groups, vector<vector <int>> &a) {
  int s = groups.size();
  for (int i = 0; i < s; i++) {
    for (int j = i + 1; j < s; j++) {
      bool has_in = false, has_out = false;
      for (int k = 0; k < (int)groups[i].size(); k++) {
        for (int l = 0; l < (int)groups[j].size(); l++) {
          int f_node = groups[i][k], l_node = groups[j][l];
          if (a[f_node][l_node] == 1)
            has_out = true;

          if (a[l_node][f_node] == 1)
            has_in = true;
        }
      }

      if (!has_in || !has_out)
        return false;
    }
  }
  return true;
}

void count_groups(int n, int k, vector<vector <int>> &a, vector<vector <int>> &cur_groups, int nr_kids, int nr_groups, int &count) {
  if (nr_kids == n && nr_groups == k) {
    if (valid_config(cur_groups, a))
      count++;
    return;
  }

  if (nr_kids < n) {
    //we add a new element to an existing group
    for (int i = 0; i < nr_groups; i++) {
      cur_groups[i].push_back(nr_kids);
      count_groups(n, k, a, cur_groups, nr_kids + 1, nr_groups, count);
      cur_groups[i].pop_back();
    }

    //we create a new group
    if (nr_groups < k) {
      cur_groups[nr_groups].push_back(nr_kids);
      count_groups(n, k, a, cur_groups, nr_kids + 1, nr_groups + 1, count);
      cur_groups[nr_groups].pop_back();
    }
  }
  return;
}

int main() {
  #ifdef INFOARENA
  ifstream cin("copii.in");
  ofstream cout("copii.out");
  #endif

  int n; cin >> n;

  vector<vector <int>> a(n, vector<int>(n));
  for (int i = 0; i < n; i++) {
    string neigh; cin >>  neigh;
    for (int j = 0; j < n; j++)
      a[i][j] = neigh[j] - '0';
  }

  int sum = 0;
  for (int k = 2; k <= n; k++) {
    int count = 0, nr_groups = 0, nr_kids = 0;
    vector<vector <int>> cur_groups(k, vector<int>());
    count_groups(n, k, a, cur_groups, nr_kids, nr_groups, count);
    sum += count;
  }
  cout << sum << "\n";
  return 0;
}