Pagini recente » Cod sursa (job #382981) | Rating Sichitiu Roxana (Roxxaannee) | Cod sursa (job #91188) | Cod sursa (job #2414297) | Cod sursa (job #1843707)
#include <bits/stdc++.h>
#define maxN 30002
#define pb push_back
using namespace std;
FILE *fin = freopen("count.in", "r", stdin);
FILE *fout = freopen("count.out", "w", stdout);
int n, m, dg[maxN], ans, sol;
vector < int > V[maxN], D[maxN * 2];
void read()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++ i)
{
int x, y;
scanf("%d %d", &x, &y);
V[x].pb(y);
V[y].pb(x);
++ dg[x];
++ dg[y];
}
}
int isEdge(int x, int y)
{
int i = 0, l = V[x].size(), p = 2;
while (p < l)
p = p * 2;
while (p)
{
if (i + p < l && V[x][i + p] < y)
i += p;
p >>= 1;
}
if (i == l - 1)
return -1;
if (V[x][i + 1] != y)
return -1;
return i + 1;
}
void get_sol(int x)
{
int mcf = 1 << (dg[x] + 1);
int v[7];
for (int i = 3; i < mcf; ++ i)
{
bool ok = 1;
v[0] = 0;
for (int j = 0; j < dg[x] && ok; ++ j)
if (i & (1 << j))
{
if (v[0] >= 3)
break;
for (int k = 1; k <= v[0]; ++ k)
if (isEdge(V[x][j], v[k]) == -1)
{
ok = 0;
break;
}
v[++ v[0]] = V[x][j];
}
if (ok)
{
if (ans < v[0] + 1)
{
ans = v[0] + 1;
sol = 1;
}
else if (ans == v[0] + 1)
++ sol;
}
}
for (int j = 0; j < dg[x]; ++ j)
{
int nod, p = isEdge(nod = V[x][j], x);
swap(V[nod][p], V[nod][dg[nod] - 1]);
V[nod].pop_back();
-- dg[nod];
}
}
void solve()
{
for (int i = 1; i <= n; ++ i)
{
sort(V[i].begin(), V[i].end());
D[dg[i]].pb(i);
}
while (n)
{
for (int i = 1; i <= 5; ++ i)
if (D[i].size())
{
get_sol(D[i].back());
D[i].pop_back();
-- n;
}
}
}
void write()
{
printf("%d %d\n", ans, sol);
}
int main()
{
read();
solve();
write();
return 0;
}