Cod sursa(job #60211)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 12 mai 2007 23:48:20
Problema Count Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#define NMAX 30030
#define B 30

using namespace std;

int *A[NMAX];
vector<int> Gra[NMAX];
int N, M, G[NMAX], V[10], Nv, S[10];
int Cmax, NCmax;
char buf[60000*2*12];

void subm(int nod)
{
        int i, j, k, n = (1<<G[nod]), x, y;

        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++){
                        x = S[k]/B; y = S[k]%B;
                        if (((A[ S[j] ][ x ]>>y)&1) == 1) 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, x, y;

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

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

        for (i = 1; i <= N; i++)
        {
            j = G[i]/B;
            A[i] = (int *)malloc((j+1)*sizeof(int));
        }

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

        for (k = 0; k < M; k++)
        {
                scanf("%d %d", &i, &j);
                x = j/B; y = j%B;
                A[i][x] += (1<<y);
        }

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

        while (n--)
        {
                Nv = 0;
                for (j = 0; j < G[i]; j++)
                {
                    V[j] = Gra[i][j]; G[ Gra[i][j] ]--;
                }
                subm(i);
                G[i] = N+1;
                for (i = 1; i <= N; i++)
                    if (G[i] < 6) break;
        }

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

        return 0;
        
}