Cod sursa(job #1843707)

Utilizator akaprosAna Kapros akapros Data 9 ianuarie 2017 09:06:27
Problema Count Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>
#define maxN 30002
#define pb push_back
using namespace std;

FILE *fin = freopen("count.in", "r", stdin);
FILE *fout = freopen("count.out", "w", stdout);

int n, m, dg[maxN], ans, sol;
vector < int > V[maxN], D[maxN * 2];

void read()
{
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; ++ i)
    {
        int x, y;
        scanf("%d %d", &x, &y);
        V[x].pb(y);
        V[y].pb(x);
        ++ dg[x];
        ++ dg[y];
    }
}

int isEdge(int x, int y)
{
    int i = 0, l = V[x].size(), p = 2;
    while (p < l)
        p = p * 2;
    while (p)
    {
        if (i + p < l && V[x][i + p] < y)
            i += p;
        p >>= 1;
    }
    if (i == l - 1)
        return -1;
    if (V[x][i + 1] != y)
        return -1;
    return i + 1;
}

void get_sol(int x)
{
    int mcf = 1 << (dg[x] + 1);
    int v[7];
    for (int i = 3; i < mcf; ++ i)
    {
        bool ok = 1;
        v[0] = 0;
        for (int j = 0; j < dg[x] && ok; ++ j)
            if (i & (1 << j))
            {
                if (v[0] >= 3)
                    break;
                for (int k = 1; k <= v[0]; ++ k)
                    if (isEdge(V[x][j], v[k]) == -1)
                    {
                        ok = 0;
                        break;
                    }
                v[++ v[0]] = V[x][j];
            }
        if (ok)
        {
            if (ans < v[0] + 1)
            {
                ans = v[0] + 1;
                sol = 1;
            }
            else if (ans == v[0] + 1)
                ++ sol;
        }
    }
    for (int j = 0; j < dg[x]; ++ j)
    {
        int nod, p = isEdge(nod = V[x][j], x);
        swap(V[nod][p], V[nod][dg[nod] - 1]);
        V[nod].pop_back();
        -- dg[nod];
    }
}

void solve()
{
    for (int i = 1; i <= n; ++ i)
    {
        sort(V[i].begin(), V[i].end());
        D[dg[i]].pb(i);
    }
    while (n)
    {
        for (int i = 1; i <= 5; ++ i)
            if (D[i].size())
            {
                get_sol(D[i].back());
                D[i].pop_back();
                -- n;
            }
    }
}

void write()
{
    printf("%d %d\n", ans, sol);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}