Cod sursa(job #1258923)

Utilizator Kira96Denis Mita Kira96 Data 9 noiembrie 2014 16:04:03
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include<fstream>
//#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#define FIT(a,b) for(vector<int>::iterator a=b.begin();a!=b.end();a++)
#include<stack>
#define ROF(a,b,c) for(long long a=b;a>=c;--a)
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(long long a=b;a<=c;++a)
#define REP(a,b) for(register int a=0;a<b;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<queue>
#define debug cerr<<"OK";
#define pii pair<int,int>
#define f cin
#define g cout
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define mod 1000000000
#define eps 1.e-7
#define N 30100
#define T 30
#define SQ 350
using namespace std;
/*ifstream f("a.in");
ofstream g("a.out");*/
/*int dx[]={0,0,1,0,-1};
int dy[]={0,1,0,-1,0};*/
ifstream f("count.in");
ofstream g("count.out");
map<pair<int,int>, bool> ma;
queue<int> q;
int n,m,viz[N],x,y,gr[N],sol,cnt,p,nrb[T*T*T],dead[N],cli[T],cur[T],t;
vector<int> v[N];
int main ()
{

	f>>n>>m;
	FOR(i,1,m)
	{
	    f>>x>>y;
	    pii aux=mp(x,y);
	    ma[aux]=1;
	    swap(aux.fi,aux.se);
	    ma[aux]=1;
	    v[x].pb(y);
	    v[y].pb(x);
	    gr[x]++;
	    gr[y]++;
	}
	FOR(i,1,n)
	if(gr[i]<6)
    {
        q.push(i);
        viz[i]=1;
    }
    FOR(i,1,128)
    {
        x=i;
        while(x)
        {
            if(x&1)
                nrb[i]++;
            x>>=1;
        }
    }
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        dead[x]=1;
        t=0;
        cli[++t]=x;
        FIT(it,v[x])
        if(!dead[*it])
        {
            cli[++t]=*it;
            gr[*it]--;
            if(!viz[*it]&&gr[*it]<6)
            {
                viz[*it]=1;
                q.push(*it);
            }
        }
        int li=1<<t;
        if(t<sol)
            continue;
        --li;
        FOR(i,1,li)
        {
            if(nrb[i]<sol)
                continue;
            t=0;
            x=i;
            p=1;
            while(x)
            {
                if(x&1)
                    cur[++t]=cli[p];
                p++;
                x>>=1;
            }
            int K=1;
            FOR(j,1,t)
            FOR(k,j+1,t)
            if(ma.find(mp(cur[j],cur[k]))!=ma.end())
                continue;
            else
            {
                K=0;
                break;
            }
            if(K)
            {
                if(t>sol)
                {
                    sol=t;
                    cnt=1;
                }
                else
                    cnt++;
            }
        }
    }
    g<<sol<<" "<<cnt;
	return 0;
}
//Look at me! Look at me! The monster inside me has grown this big!