Cod sursa(job #1193662)

Utilizator andreiiiiPopa Andrei andreiiii Data 1 iunie 2014 13:43:42
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <algorithm>
#include <cstdio>
#include <unordered_set>
#include <queue>
#include <vector>

using namespace std;

const int Nmax = 30005;

unordered_set<int> G[Nmax];
queue<int> Q;

int N, Sol, Solcnt;
int nodes[7], nrnodes;

vector<int> Tnodes;

void Back(const int k)
{
    if (k == int(Tnodes.size()))
    {
        if (nrnodes > Sol)
            Sol = nrnodes,
            Solcnt = 1;
        else if(nrnodes == Sol)
            Solcnt++;

        return;
    }

    const int node = Tnodes[k];

    bool ok = 1;
    for (int i = 1; i <= nrnodes; i++)
    {
        if (G[nodes[i]].find(node) == G[nodes[i]].end())
            ok = 0;
    }

    if (ok)
    {
        nodes[++nrnodes] = node;
        Back(k + 1);
        nrnodes--;
    }

    Back(k + 1);
}

int main()
{
    freopen("count.in", "r", stdin);
    freopen("count.out", "w", stdout);

    int M;
    scanf("%d%d", &N, &M);

    while (M--)
    {
        int x, y;
        scanf("%d%d", &x, &y);

        G[x].insert(y);
        G[y].insert(x);
    }

    for (int i = 1; i <= N; i++)
        if (G[i].size() < 6)
            Q.push(i);

    while (!Q.empty())
    {
        const int node = Q.front();
        Q.pop();

        Tnodes = vector<int> (G[node].begin(), G[node].end());
        nodes[nrnodes = 1] = node;
        Back(0);

        for (auto p: G[node])
        {
            G[p].erase(node);
            if (G[p].size() == 5U)
                Q.push(p);
        }
        G[node].clear();
    }

    printf("%d %d\n", Sol, Solcnt);
}