Cod sursa(job #239324)

Utilizator mariusdrgdragus marius mariusdrg Data 4 ianuarie 2009 16:18:55
Problema Count Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back

using namespace std;
const int maxn = 100000;

int GR[maxn],ST[maxn];
int N,M,VER[maxn],MAT[30];
vector<int> VECT[maxn],NODCUR,NODCUR2;

bool cautare(vector<int> &vect,int val)
{
	int p = 0,x = 0,n = vect.size();
	for(p = 1;p < n; p <<= 1);
	for(;p;p >>= 1)
		if (x + p < n && vect[x + p] <= val) x += p;
	return vect[x] == val;
}

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);
		VECT[x].pb(y);
		VECT[y].pb(x);
	}
	int maxa = 0,nrsol = 0;
	for(int i = 1;i <= N; ++i) sort(VECT[i].begin(),VECT[i].end());
	for(int i = 1;i <= N; ++i) VECT[i].resize(unique(VECT[i].begin(),VECT[i].end()) - VECT[i].begin());
	for(int i = 1;i <= N; ++i) GR[i] = VECT[i].size();
	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]);
		}
		if (NODCUR.size() > 6) printf("caca\n");
		memset(MAT,0,sizeof(MAT));
        for(unsigned int j = 0;j < NODCUR.size(); ++j) MAT[j] |= (1 << j);
		for(unsigned int j = 0;j < NODCUR.size(); ++j)
	        for(unsigned int k = j + 1;k < NODCUR.size(); ++k)
		        if (cautare(VECT[NODCUR[j]],NODCUR[k])) {MAT[j] |= (1 << k); MAT[k] |= (1 << j);}
		for(int st = 0; st < (1 << NODCUR.size()); ++st)
		{
			int ver = 1,nrnod = 1;
			for(unsigned int j = 0;j < NODCUR.size(); ++j)
			{
				if (st & (1 << j)) nrnod++;
				if (st & (1 << j) && ((st & MAT[j]) != st)) ver = 0; 	
			}
			if (!ver) continue;
			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;
}