Cod sursa(job #81730)

Utilizator peanutzAndrei Homorodean peanutz Data 4 septembrie 2007 01:23:00
Problema Count Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>
#include <memory.h>
#include <set>

using namespace std;

#define NMAX 30002

int n, m;
int maxim, nr;
int g[NMAX];
set<int> a[NMAX];

#define DIM 4000000
char buf[DIM];
int poz;
#define cin(x)		\
{			\
	x = 0;		\
	while(buf[poz] < '0' || buf[poz] > '9')  \
		if(++poz == DIM)		\
			fread(buf, 1, DIM, stdin), poz = 0; 	\
	while(buf[poz] >= '0' && buf[poz] <= '9')		\
	{							\
		x = x*10 + (buf[poz]-'0');			\
		if(++poz == DIM)				\
			fread(buf, 1, DIM, stdin), poz = 0;	\
	}							\
}



void read()
{
	fread(buf, 1, DIM, stdin);
	int i, x, y;
	cin(n);
	cin(m);
	for(i = 1; i <= m; ++i)
	{
		cin(x);
		cin(y);
		a[x].insert(y), a[y].insert(x);
		++g[x], ++g[y];
	}
}

int c[6];

void back(int x, int k)
{
    if(k <= 4)
{
	set<int> :: iterator it, fin = a[x].end();
	int i, j;
	short ok;

	for(it = a[x].begin(); it != fin; ++it)
	{
		for(ok = 1, j = 0; j < k && ok; ++j)
			if(a[*it].find(c[j]) == a[*it].end())
				ok = 0;

		if(ok)
		{
			c[k] = *it;
			back(*it, k+1);
		}
	}
	if(k == maxim)
		++nr;
	else if(k > maxim)
    	maxim = k, nr = 1;
       //for(i = 0; i < k; ++i)
           //printf("%d ", c[i]);
           //printf("\n");
}
}
		
void df(int x)
{
	c[0] = x;
	back(x, 1);

	set<int> :: iterator it, fin = a[x].end();

	for(it = a[x].begin(); it != fin; ++it)
	{
		--g[ *it ];
		a[*it].erase(x);
	}

	short ok = 1;
	for(it = a[x].begin(); it != fin; ++it)
	{
		if(g[ *it ] < 6 && ok)
			df(*it), ok = 0;
	}
}

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

	read();

	int i;
	for(i = 1; i <= n; ++i)
		if(g[i] < 6 && !g[i])
		{
			df(i);
		}

	printf("%d ", maxim);
    if(maxim <= 2)
       printf("%d\n", nr);
    if(maxim == 3)
       printf("%d\n", nr/2);
    if(maxim == 4)
       printf("%d\n", nr/6);

	return 0;
}