Pagini recente » Cod sursa (job #1727178) | Cod sursa (job #637324) | Cod sursa (job #66902) | Cod sursa (job #2680500) | Cod sursa (job #239316)
Cod sursa(job #239316)
#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);
GR[x]++;GR[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) 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 (j != 0 && VECT[nod][j] == VECT[nod][j - 1]) continue;
if (VER[VECT[nod][j]] != 2) NODCUR.pb(VECT[nod][j]);
}
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;
}