Cod sursa(job #1846575)

Utilizator mihai.alphamihai craciun mihai.alpha Data 13 ianuarie 2017 14:27:29
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
#define maxN 30002
#define sit std::multiset<int>::iterator
using namespace std;

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

int n, m, dg[maxN], ans, sol, Nod;
vector < int > D, st;
multiset <int> V[maxN];
bool in[maxN];

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

bool ok(int x)
{
    for (int i = 0; i < st.size(); ++ i)
        if (!V[x].count(st[i]))
            return 0;
    return 1;
}

void back(int x, int len, sit p)
{
    if (len > ans)
    {
        ans = len;
        sol = 1;
    }
    else if (len == ans)
        ++ sol;
    if (len == 4)
        return ;
    for (sit it = p; it != V[Nod].end(); ++ it)
        if (ok(*it))
        {
            st.push_back(*it);
            sit It = it;
            ++ It;
            back(*it, len + 1, It);
            st.pop_back();
        }
}

void solve()
{
    for (int i = 1; i <= n; ++ i)
        if (dg[i] < 6)
        {
            D.push_back(i);
            in[i] = 1;
        }

    while (n && !D.empty())
    {
        Nod = D.back();
        back(Nod, 1, V[Nod].begin());
        D.pop_back();
        for (sit it = V[Nod].begin(); it != V[Nod].end(); ++ it)
        {
            -- dg[*it];
            V[*it].erase(Nod);
            if (dg[*it] < 6 && !in[*it])
            {
                D.push_back(*it);
                in[*it] = 1;
            }
        }
        -- n;
    }
}

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

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