Cod sursa(job #337668)

Utilizator rumburakrumburak rumburak Data 4 august 2009 15:30:38
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#include<map>

using namespace std;

const int N = (1<<15);

vector<int> a[N];
vector<pair<int,int> > d;
map<int,int> h[N];
int n,m,maxx,nrx,gr[N];

void citire()
{
	int i,x,y,nr=0;
	scanf("%d%d",&n,&m);
	d.resize(n);
	for(i=0;i<n;++i)
	{
		d[i].first=0;
		d[i].second=1+i;
	}
	maxx=2;
	nrx=m;
	while(m--)
	{
		scanf("%d%d",&x,&y);
		++d[x-1].first;
		++d[y-1].first;
		++gr[x];
		++gr[y];
		a[x].push_back(y);
		a[y].push_back(x);
		h[x][y]=++nr;
		h[y][x]=++nr;
	}
	sort(d.begin(),d.end());
}

inline bool ok3(int x,int y,int z)
{
	return h[x].find(y)!=h[x].end() && h[x].find(z)!=h[x].end() && h[y].find(z)!=h[y].end();
}

inline bool ok2(int x,int y)
{
	return h[x].find(y)!=h[x].end();
}

void complet(int x)
{
	int i,j,k,nr=a[x].size();
	for(i=0;i<nr;++i)
		if(gr[a[x][i]]>=3)
		for(j=i+1;j<nr;++j)
			if(gr[a[x][j]]>=3)
			for(k=j+1;k<nr;++k)
				if(gr[a[x][j]]>=3)
				if(ok3(a[x][i],a[x][j],a[x][k]))
				{
					if(maxx==4)
						++nrx;
					if(maxx!=4)
					{
						maxx=4;
						nrx=1;
					}
				}
	if(maxx!=4)
	{
		for(i=0;i<nr;++i)
			if(gr[a[x][i]]>=2)
			for(j=i+1;j<nr;++j)
				if(gr[a[x][j]]>=2)
				if(ok2(a[x][i],a[x][j]))
				{
					if(maxx==3)
						++nrx;
					if(maxx<3)
					{
						maxx=3;
						nrx=1;
					}
				}
	}
	for(i=0;i<nr;++i)
	{
		k=a[x][i];
		if(h[x].find(k)!=h[x].end())
		{
			h[x].erase(k);
			--gr[x];
		}
		if(h[k].find(x)!=h[k].end())
		{
			h[k].erase(x);
			--gr[k];
		}
	}
	for(i=0;i<nr;++i)
	{
		k=a[x][i];
		if(gr[k] && gr[k]<6)
			complet(k);
	}
}

void calcul()
{
	int i;
	for(i=0;i<n;++i)
		if(gr[d[i].second])
			complet(d[i].second);
	printf("%d %d\n",maxx,nrx);
}

int main()
{
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout);
	citire();
	calcul();
	return 0;
}