Pagini recente » Cod sursa (job #160469) | Cod sursa (job #831244) | Cod sursa (job #2400565) | Cod sursa (job #2569946) | Cod sursa (job #81731)
Cod sursa(job #81731)
#include <stdio.h>
#include <memory.h>
#include <set>
using namespace std;
#define NMAX 30002
int n, m;
int maxim, nr;
int g[NMAX];
set<int> a[NMAX];
#define DIM 4000000
char buf[DIM];
int poz;
#define cin(x) \
{ \
x = 0; \
while(buf[poz] < '0' || buf[poz] > '9') \
if(++poz == DIM) \
fread(buf, 1, DIM, stdin), poz = 0; \
while(buf[poz] >= '0' && buf[poz] <= '9') \
{ \
x = x*10 + (buf[poz]-'0'); \
if(++poz == DIM) \
fread(buf, 1, DIM, stdin), poz = 0; \
} \
}
void read()
{
fread(buf, 1, DIM, stdin);
int i, x, y;
cin(n);
cin(m);
for(i = 1; i <= m; ++i)
{
cin(x);
cin(y);
a[x].insert(y), a[y].insert(x);
++g[x], ++g[y];
}
}
int c[6];
void back(int x, int k)
{
if(k <= 4)
{
set<int> :: iterator it, fin = a[x].end();
int i, j;
short ok;
for(it = a[x].begin(); it != fin; ++it)
{
for(ok = 1, j = 0; j < k && ok; ++j)
if(a[*it].find(c[j]) == a[*it].end())
ok = 0;
if(ok)
{
c[k] = *it;
back(*it, k+1);
}
}
if(k == maxim)
++nr;
else if(k > maxim)
maxim = k, nr = 1;
//for(i = 0; i < k; ++i)
//printf("%d ", c[i]);
//printf("\n");
}
}
void df(int x)
{
c[0] = x;
back(x, 1);
set<int> :: iterator it, fin = a[x].end();
for(it = a[x].begin(); it != fin; ++it)
{
--g[ *it ];
a[*it].erase(x);
}
short ok = 1;
for(it = a[x].begin(); it != fin; ++it)
{
if(g[ *it ] < 6 && ok)
df(*it), ok = 0;
}
}
int main()
{
freopen("count.in", "r", stdin);
freopen("count.out", "w", stdout);
read();
int i;
for(i = 1; i <= n; ++i)
if(g[i] < 6 && g[i] > 0)
{
df(i);
}
printf("%d ", maxim);
if(maxim <= 2)
printf("%d\n", nr);
if(maxim == 3)
printf("%d\n", nr/2);
if(maxim == 4)
printf("%d\n", nr/6);
return 0;
}