Cod sursa(job #60143)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 12 mai 2007 18:53:04
Problema Count Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <set>
#define NMAX 30030

using namespace std;

set<int> A[NMAX];
int N, M, G[NMAX], V[10], Nv, S[10];
int Cmax, NCmax;

void subm()
{
        int i, j, k, n = (1<<Nv);

        for (i = 0; i < n; i++)
        {
                int num = 0, ns = 0;
                for (j = 0; j <= n; j++)
                    if ( ((i>>j)&1) == 1 ) S[ns++] = V[j];
                for (j = 0; j < ns; j++)
                    for (k = j+1; k < ns; k++)
                        if (A[ S[j] ].find(S[k]) != NULL) num++;
                if (2*num == (ns-1)*ns)
                   if (Cmax < ns) Cmax = ns, NCmax = 1;
                   else
                       if (Cmax == ns) NCmax++;
        }

}

int main()
{
        int i, j, k, n;
        set<int>::iterator it;

        freopen("count.in", "r", stdin);
        scanf("%d %d", &N, &M);

        for (k = 0; k < M; k++)
        {
                scanf("%d %d", &i, &j);
                A[i].insert(j); G[i]++; G[j]++;
                A[j].insert(i);
        }

        n = N;
        for (i = 1; i <= N; i++)
            if (G[i] < 6) break;

        while (n>0)
        {
                Nv = 0;
                for (it = A[i].begin(); it != A[i].end(); ++it)
                {
                    V[Nv++] = *it;
                    G[*it]--;
                }
                G[i] = N+1;
                subm();
                for (i = 1; i <= N; i++)
                    if (G[i] < 6) break;
                n--;
        }

        freopen("count.out", "w", stdout);
        printf("%d %d\n", Cmax, NCmax);

        return 0;
        
}