Cod sursa(job #2229156)

Utilizator giotoPopescu Ioan gioto Data 6 august 2018 00:43:09
Problema Count Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#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;
}