Cod sursa(job #121399)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 8 ianuarie 2008 17:13:15
Problema Count Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <vector>
#include <set>

using namespace std;

#define maxn 30010
#define pb push_back
#define mp make_pair
#define ll long long

int n,m,l;
vector <int> a[maxn];
set< pair<int, int> > S;
set< pair<int, int> > :: iterator I;
int g[maxn],c[maxn],s[maxn],u[maxn];
int sol;
ll rez;

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

	scanf("%d %d ",&n,&m);

	int i,x,y,j,k;

	for (i=1;i<=m;i++)
	{
		scanf("%d %d ",&x,&y);

		if (x>y) swap(x,y);

		a[x].pb(y);
		a[y].pb(x);
		S.insert(mp(x,y));
		S.insert(mp(y,x));
	}

	I = S.end();

	for (i=1;i<=n;i++) g[i] = c[i] = a[i].size();

	sol = 2;
	rez = m;

	for (i=1;i<=n;i++)
		if (c[i] < 6) 
		{
			u[i] = 1;
			s[++l] = i;
		}

	for (i=1;i<=l;i++)
	{
		for (j=0;j<g[s[i]];j++)
		{
			c[a[s[i]][j]]--;
		
			if (!u[a[s[i]][j]] && c[a[s[i]][j]]<6) 
			{
				s[++l] = a[s[i]][j];
				u[a[s[i]][j]] = 1;
			}
		}

		for (j=0;j<g[s[i]];j++)
			for (k=j+1;k<g[s[i]];k++)
				if (S.find(mp(a[s[i]][j],a[s[i]][k]))!=I)
					for (x=k+1;x<g[s[i]];x++)
						if (S.find(mp(a[s[i]][j],a[s[i]][x]))!=I && S.find(mp(a[s[i]][k],a[s[i]][x]))!=I)
						{
							if (sol<4) 
							{
								sol = 4;
								rez = 1;
							}
							else if (sol == 4) rez++;
						}

		if (sol<4) 
			for (j=0;j<g[s[i]];j++)
				for (k=j+1;k<g[s[i]];k++)
					if (S.find(mp(a[s[i]][j],a[s[i]][k]))!=I)
					{
						if (sol<3) 
						{
							sol = 3;
							rez = 1;
						}
						else if (sol == 3) rez++;
					}
	}

	printf("%d %lld\n",sol,rez/sol);

	return 0;
}