Pagini recente » Cod sursa (job #13822) | Cod sursa (job #2802899) | Cod sursa (job #1159337) | Cod sursa (job #2230666) | Cod sursa (job #2473807)
#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;
}