#include #include using namespace std; typedef unsigned long long int ulli; int nfound; ulli foundsets[1000][2]; ulli aux[64]; ulli tmp; int nvertices; int nedges; bool edges[128][128]; bool visited[128]; bool finished; void dfs(int v) { int i, j; bool someok = false, ok; ulli newfound[2]; bool alreadyfound; if (finished) return; visited[v] = true; for (i = v; i < nvertices && !finished; i++) { if (edges[i][v] && !visited[i]) { ok = true; for (j = 0; j < nvertices && ok; j++) { if (j != i && visited[j] && !edges[j][i]) ok = false; } if (ok) { someok = true; dfs(i); visited[i] = false; } } } if (!someok && !finished) { newfound[0] = 0; newfound[1] = 0; for (i = 0; i < nvertices; i++) { if (visited[i]) { //cout << i << " "; newfound[i/64] |= aux[i%64]; } } //cout << endl; //cout << newfound[0] << endl; alreadyfound = false; for (i = 0; i < nfound && !alreadyfound; i++) { if ((foundsets[i][0] & newfound[0]) == newfound[0] && (foundsets[i][1] & newfound[1]) == newfound[1]) { alreadyfound = true; } } if (!alreadyfound) { if (nfound < 1000) { foundsets[nfound][0] = newfound[0]; foundsets[nfound][1] = newfound[1]; nfound++; } else { finished = true; } } else { //cout << "Already found" << endl; } } } int main(void) { int i, j, from, to; tmp = 1; for (i = 0; i < 64; i++) { aux[i] = tmp; tmp <<= 1; } /* cout << "70 " << 20*50 << endl; for (i = 0; i < 20; i++) for (j = 0; j < 50; j++) { cout << i + 1 << " " << j + 21 << endl; } */ while (scanf("%d %d", &nvertices, &nedges) == 2) { for (i = 0; i < nvertices; i++) { for (j = 0; j < nvertices; j++) { edges[i][j] = false; } } for (i = 0; i < nedges; i++) { scanf("%d %d", &from, &to); edges[from - 1][to - 1] = true; edges[to - 1][from - 1] = true; } nfound = 0; for (i = 0; i < nvertices; i++) { for (j = 0; j < nvertices; j++) visited[j] = false; dfs(i); } if (!finished) printf("%d\n", nfound); else puts("Too many maximal sets of friends."); } return 0; }