Cod sursa(job #1086565)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 18 ianuarie 2014 12:27:22
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

#define maxn 30001
#define vint vector<int>::iterator

using namespace std;

ifstream fin("count.in");
ofstream fout("count.out");

vector<int> G[maxn];
priority_queue <pair<int,int> , vector<pair<int,int> >, greater<pair<int,int> > > H;

int n,m,a,b,deg[maxn];
int t,st[6],cnt,maxv;
bool viz[maxn];

void back (int k, int x)
{
    if (t+1 > maxv)
    {
        maxv = t+1;
        cnt = 1;
    }
    else if (t+1 == maxv)
    {
        ++cnt;
    }

    for (; k < G[x].size(); ++k)
    {
        if (viz[G[x][k]]) continue;

        bool ok=1;
        for (int i=1; i<=t; ++i)
        {
            int lo = -1, hi = G[st[i]].size();

            while (hi - lo > 1)
            {
                int mid = (lo+hi)/2;
                if (G[st[i]][mid] >= G[x][k])
                    hi = mid;
                else lo = mid;
            }

            if (!(hi != G[st[i]].size() && G[st[i]][hi] == G[x][k]))
            {
                ok = 0;
                break;
            }
        }

        if (ok)
        {
            st[++t] = G[x][k];
            back (k+1,x);
            --t;
        }
    }
}

int main()
{
    fin>>n>>m;

    for (int i=1; i<=m; ++i)
    {
        fin>>a>>b;

        G[a].push_back (b);
        G[b].push_back (a);

        deg[a]++;
        deg[b]++;
    }

    for (int i=1; i<=n; ++i)
    {
        sort (G[i].begin(),G[i].end());
    }

    for (int i=1; i<=n; ++i)
    {
        H.push (make_pair (deg[i],i));
    }

    while (!H.empty())
    {
        int x = H.top().second;
        H.pop ();

        if (viz[x])
            continue;

        viz[x] = 1;

        t=0;
        back (0,x);

        for (vint it = G[x].begin();it != G[x].end(); ++it)
        {
            deg[*it]--;
            H.push (make_pair (deg[*it],*it));
        }
    }

    fout<<maxv<<" "<<cnt;
}