Cod sursa(job #499159)

Utilizator ZethpixZethpix Zethpix Data 8 noiembrie 2010 21:39:45
Problema Count Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>

int n,m,S,i,gr[30005],x,y,nr,sol[30005],B,M=999983;

struct hash
{
	int nod;
	hash *link;
}*H[1000000];
inline void add(int x)
{
	hash *p;
	p=new hash;
	p->nod=x;
	p->link=H[x%M];
	H[x%M]=p;
}

inline int src(int x)
{
	hash *p;
	p=H[x%M];
	while(p!=NULL)
	{
		if(p->nod==x) return 1;
		p=p->link;
	}
	return 0;
}

inline int check(int S)
{
	int i,j;
	for(i=1;i<S;i++)
		for(j=i+1;j<=S;j++)
			if(src(sol[i]*B+sol[j])==0) return 0;
	return 1;
}

inline void back(int k)
{
	int i;

	if(k>S)
	{
		if(check(S)) nr++;
	}
	else
		for(i=sol[k-1]+1;i<=n;i++)
			if(gr[i]<6&&gr[i]>=S-1&&(src(sol[k-1]*B+i)||k==1))
			{
				sol[k]=i;
				back(k+1);
			}
}

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

	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) gr[i]=0;
	B=n+1;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		add(x*B+y);
		add(y*B+x);
		gr[x]++;
		gr[y]++;
	}

	nr=0;
	sol[0]=0;
	S=4;
	back(1);

	if(nr==0)
	{
		S=3;
		back(1);
		printf("%d %d\n",S,nr);
		return 0;
	}

	printf("%d %d\n",S,nr);
	return 0;
}