Pagini recente » Cod sursa (job #2116410) | Cod sursa (job #878988) | Cod sursa (job #1923606) | Cod sursa (job #716127) | Cod sursa (job #2229156)
#include <bits/stdc++.h>
using namespace std;
int n, m;
int gr[30005];
int G[5];
bool p[30005], f[30005];
queue <int> q;
vector <int> List;
vector <int> v[30005];
unordered_set <int> H[30005];
int Max, cnt;
inline void back(vector <int> :: iterator nod, int nr){
if(nod == List.end()){
if(nr > Max) Max = nr, cnt = 1;
else if(nr == Max) ++cnt;
return ;
}
back(nod + 1, nr);
int nd = *nod;
for(int i = 1; i <= nr ; ++i)
if(H[*nod].find(G[i]) == H[*nod].end()) return ;
G[nr + 1] = *nod;
back(nod + 1, nr + 1);
}
int main()
{
freopen("count.in", "r", stdin);
freopen("count.out", "w", stdout);
scanf("%d%d", &n, &m);
int x, y;
for(int i = 1; i <= m ; ++i){
scanf("%d%d", &x, &y);
v[x].push_back(y); H[x].insert(y);
v[y].push_back(x); H[y].insert(x);
++gr[x]; ++gr[y];
}
int w = 1;
for(int i = 2; i <= n ; ++i)
if(gr[i] < 6) w = gr[i];
Max = 2; cnt = m;
q.push(w); f[w] = 1;
while(!q.empty()){
int nod = q.front();
q.pop(); p[nod] = 1;
List.push_back(nod);
for(auto it : v[nod]){
if(p[it]) continue ;
List.push_back(it);
if(f[it]) continue ;
--gr[it];
if(gr[it] < 6) q.push(it), f[it] = 1;
}
vector <int> :: iterator it = List.begin();
back(it, 0);
List.clear();
}
printf("%d %d", Max, cnt);
return 0;
}