Cod sursa(job #2229160)

Utilizator giotoPopescu Ioan gioto Data 6 august 2018 00:45:19
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 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];
    }

    for(int i = 1; i <= n ; ++i){
        if(gr[i] < 6){
            q.push(i);
            f[i] = 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;
}