Pagini recente » Cod sursa (job #2648434) | Cod sursa (job #419069) | Cod sursa (job #969644) | Cod sursa (job #966305) | Cod sursa (job #930978)
Cod sursa(job #930978)
#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;
}