Cod sursa(job #749170)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 15 mai 2012 23:18:56
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include<fstream>
#include<vector>
#include<queue>

using namespace std;

ifstream f("count.in");
ofstream g("count.out");

const int maxn=30002;
const int mod=666013;

vector<int>hash[mod];

vector<int>a[maxn];

int grade[maxn],n,m,i,x,y,list[6],back,j,r,gas,maxt,manyt;

bool been[maxn],been2[maxn];

inline void insert(int x)
{
    int list=x%mod;
    hash[list].push_back(x);
}

inline int find(int x,int y)
{
    x=(x<<16)+y;
    int list=x%mod;
    vector<int>::iterator it;
    for(it=hash[list].begin();it!=hash[list].end();++it)
        if(*it==x)
            break;
    if(it==hash[list].end())
        return 1;
    return 0;
}

queue<int>Q;

int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
        insert((x<<16)+y);
        insert((y<<16)+x);
        ++grade[x];
        ++grade[y];
    }

    for(i=1;i<=n;++i)
        if(grade[i]<6)
            Q.push(i),been2[i]=true;



    while(!Q.empty())
    {
        x=Q.front();
        Q.pop();
        been[x]=true;
        y=0;
        list[1]=list[2]=list[3]=list[4]=list[5];
        for(vector<int>::iterator it=a[x].begin();it!=a[x].end();++it)
            if(been[*it]==false)
            {
                list[++y]=*it;
                --grade[*it];
                if(grade[*it]<6&&been2[*it]==false)
                    Q.push(*it),been2[*it]=true;
            }
        back=(1<<y)-1;
        for(back;back;--back)
        {
            gas=0;
            for(j=0;(1<<j)<=back;++j)
                if((1<<j)&back)
                {
                    ++gas;
                    for(r=j+1;(1<<r)<=back;++r)
                        if((1<<r)&back)
                            if(find(list[r+1],list[j+1]))
                                r=20,j=20;
                }
            if(r==21)continue;
            if(gas+1>maxt)
                maxt=gas+1,manyt=1;
            else
                if(gas+1==maxt)
                    ++manyt;
        }
    }

    g<<maxt<<" "<<manyt<<"\n";

    f.close();
    g.close();

    return 0;
}