Cod sursa(job #930978)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 27 martie 2013 22:09:46
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <cstring>
#include <cassert>

using namespace std;

const int MAX_N = 12;

int N, G[MAX_N], Size, Sets[MAX_N], SetG[MAX_N], Solution;

inline int GetBit(const int X, const int Bit) {
    return (X >> Bit) & 1;
}

inline int Valid() {
    memset(SetG, 0, sizeof(SetG));
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            if (GetBit(G[i], j))
                SetG[Sets[i]] |= (1 << Sets[j]);
    int ReqEdges = (1 << Size) - 1;
    for (int i = 0; i < Size; ++i) {
        SetG[i] |= (1 << i);
        if (SetG[i] != ReqEdges)
            return 0;
    }
    return 1;
}

void Back(int K) {
    if (K == N) {
        if (Size > 1)
            Solution += Valid();
        return;
    }
    for (int i = 0; i < Size; ++i) {
        Sets[K] = i;
        Back(K + 1);
    }
    Sets[K] = Size++;
    Back(K + 1);
    --Size;
}

void Solve() {
    Size = 0;
    Back(0);
}

void Read() {
    assert(freopen("copii.in", "r", stdin));
    assert(scanf("%d", &N) == 1);
    for (int i = 0; i < N; ++i) {
        char Line[MAX_N]; assert(scanf("\n%s", Line) == 1);
        for (int j = 0; j < N; ++j)
            G[i] |= ((Line[j] - '0') << j);
    }
}

void Print() {
    assert(freopen("copii.out", "w", stdout));
    printf("%d\n", Solution);
}

int main() {
    Read();
    Solve();
    Print();
    return 0;
}