Cod sursa(job #239283)

Utilizator mariusdrgdragus marius mariusdrg Data 4 ianuarie 2009 15:25:11
Problema Count Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<stdio.h>
#include<set>
#include<vector>
#define pb push_back

using namespace std;
const int maxn = 40000;

int GR[maxn],ST[maxn];
int N,M,VER[maxn];
set<short> S[maxn];
vector<short> VECT[maxn],NODCUR,NODCUR2;

int main()
{
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout);
	scanf("%d %d\n",&N,&M);
	for(int i = 1;i <= M; ++i)
	{
		int x,y;
		scanf("%d %d\n",&x,&y);
		GR[x]++;GR[y]++;
		S[x].insert(y);VECT[x].pb(y);
		S[y].insert(x);VECT[y].pb(x);
	}
	int maxa = 0,nrsol = 0;
	for(int i = 1;i <= N; ++i) if (GR[i] <= 5) {ST[++ST[0]] = i;VER[i] = 1;}
	for(int i = 1;i <= ST[0]; ++i)
	{
		int nod = ST[i];
		NODCUR.clear();
		for(unsigned int j = 0;j < VECT[nod].size(); ++j)
		{
			if (VER[VECT[nod][j]] != 2) NODCUR.pb(VECT[nod][j]);
		}
		for(int st = 0; st <= (1 << NODCUR.size()); ++st)
		{
			NODCUR2.clear();
			for(unsigned int j = 0;j < NODCUR.size(); ++j)
			{
				if (st & (1 << j)) NODCUR2.pb(NODCUR[j]); 	
			}
			int ver = 1;
			for(unsigned int j = 0;j < NODCUR2.size(); ++j)
				for(unsigned int k = j + 1;k < NODCUR2.size(); ++k)
					if (S[NODCUR2[j]].find(NODCUR2[k]) == S[NODCUR2[j]].end()) ver = 0;	
			if (!ver) continue;
			int nrnod = NODCUR2.size() + 1;
			if (nrnod > maxa) {maxa = nrnod;nrsol = 0;}
			if (nrnod == maxa) nrsol++;
		}
		VER[nod] = 2;
		for(unsigned int j = 0;j < VECT[nod].size(); ++j)
		{
			if (VER[VECT[nod][j]]) continue;
			GR[VECT[nod][j]]--;
			if (GR[VECT[nod][j]]) {ST[++ST[0]] = VECT[nod][j];VER[VECT[nod][j]] = 1;}
		}
	}
	printf("%d %d\n",maxa,nrsol);
	return 0;
}