Cod sursa(job #2475821)

Utilizator mihaicivMihai Vlad mihaiciv Data 17 octombrie 2019 17:13:21
Problema Copii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <cstdlib>
//#define f cin
#define NMAX 8001
using namespace std;
ifstream f("copii.in");
ofstream g("copii.out");

int n, v[20];
int cnt;
int dim[20];
vector<int> a[20];
int dp[20][20];
int test_crt;

bool valid(int k, int v_max) {
    return true;
}

bool verif(vector<int> &b, int echipa_curenta, int v_max) {
    int vis[12];
    for (int i = 0; i < n; ++i) {
        vis[i] = 0;
    }
    vis[echipa_curenta] = 1;
    for (int i = 0; i < b.size(); ++i) {
        int el_curent = b[i];
        for (int j = 0; j < a[el_curent].size(); ++j) {
            vis[v[a[el_curent][j]]] = 1;

        }
    }
    for (int i = 0; i <= v_max; ++i) {
        if (vis[i] == 0) return false;
    }
    return true;
}

void prelucrare(int v_max) {
    test_crt ++;
    if (v_max == 0) return;

    for (int i = 0; i < n;++i) {
        int el_current = i;
        for (int j = 0; j < a[el_current].size(); ++j) {
            int vecin_current = a[el_current][j];
            if (v[el_current] != v[vecin_current] && dp[v[el_current]][v[vecin_current]] != test_crt) {
                dim[v[el_current]] ++;
                dp[v[el_current]][v[vecin_current]] = test_crt;
            }
        }
    }

    bool found = true;

    for (int i = 0; i <= v_max; ++i) {
       if (dim[i] != v_max) found = false;
    }

    if (found) {
        cnt ++;
    }

    for (int i = 0; i < n; ++i) {
        dim[i] = 0;
    }

}

void bk(int k, int v_max) {
    for (int i = 0; i <= v_max + 1; ++i) {
        v[k] = i;
        if (valid(k, max(v_max, v[k]))) {
            if (k == n - 1) {
                prelucrare(max(v[k], v_max));
            } else {
                if (v[k] > v_max) {
                    bk(k + 1, v[k]);
                } else {
                    bk(k + 1, v_max);
                }
            }
        }
    }

}

int main() {

    f >> n;
    for (int i = 0; i < n; ++i) {
        string s;
        f >> s;
        for (int j = 0; j < s.size(); ++j) {
            if (s[j] == '1') {
                a[i].push_back(j);
            }
        }
    }

    bk(0, -1);

    g << cnt;

    return 0;
}