Pagini recente » Cod sursa (job #1881807) | Cod sursa (job #1046561) | asdfasdgs | Cod sursa (job #1959233) | Cod sursa (job #1846575)
#include <bits/stdc++.h>
#define maxN 30002
#define sit std::multiset<int>::iterator
using namespace std;
FILE *fin = freopen("count.in", "r", stdin);
FILE *fout = freopen("count.out", "w", stdout);
int n, m, dg[maxN], ans, sol, Nod;
vector < int > D, st;
multiset <int> V[maxN];
bool in[maxN];
void read()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++ i)
{
int x, y;
scanf("%d %d", &x, &y);
V[x].insert(y);
V[y].insert(x);
++ dg[x];
++ dg[y];
}
}
bool ok(int x)
{
for (int i = 0; i < st.size(); ++ i)
if (!V[x].count(st[i]))
return 0;
return 1;
}
void back(int x, int len, sit p)
{
if (len > ans)
{
ans = len;
sol = 1;
}
else if (len == ans)
++ sol;
if (len == 4)
return ;
for (sit it = p; it != V[Nod].end(); ++ it)
if (ok(*it))
{
st.push_back(*it);
sit It = it;
++ It;
back(*it, len + 1, It);
st.pop_back();
}
}
void solve()
{
for (int i = 1; i <= n; ++ i)
if (dg[i] < 6)
{
D.push_back(i);
in[i] = 1;
}
while (n && !D.empty())
{
Nod = D.back();
back(Nod, 1, V[Nod].begin());
D.pop_back();
for (sit it = V[Nod].begin(); it != V[Nod].end(); ++ it)
{
-- dg[*it];
V[*it].erase(Nod);
if (dg[*it] < 6 && !in[*it])
{
D.push_back(*it);
in[*it] = 1;
}
}
-- n;
}
}
void write()
{
printf("%d %d\n", ans, sol);
}
int main()
{
read();
solve();
write();
return 0;
}