Cod sursa(job #1138502)

Utilizator smaraldaSmaranda Dinu smaralda Data 10 martie 2014 09:54:32
Problema Count Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<stdio.h>
#include<vector>
#include<bitset>
#include<algorithm>
#include<tr1/unordered_set>
using namespace std;

const int NMAX = 3e5;

std::tr1::unordered_set <int> graph[NMAX + 5];
vector <int> dir, sub;
int n, cnt, maxsz, deg[NMAX + 5], vis[NMAX + 5];

bool isClique () {
    for(int i = 0; i < sub.size(); ++ i)
        for(int j = i + 1; j < sub.size(); ++ j)
            if(!graph[sub[i]].count(sub[j]))
                return 0;
    return 1;
}

void countCliques () {
    int i, j, num, s, bit;

    num = 1 << dir.size();
    for(s = 1; s <= num; ++ s) {
        sub.clear();
        for(bit = 0; bit < dir.size(); ++ bit)
            if(s & (1 << bit))
                sub.push_back(dir[bit]);

        if(isClique()) {
            if(sub.size() > maxsz)
                maxsz = sub.size(),
                cnt = 0;

            if(sub.size() == maxsz)
                ++ cnt;
        }
    }
}

void dfs (int node) {
    std::tr1::unordered_set <int>::iterator it;


    dir.clear();
    dir.push_back(node);
    for(it = graph[node].begin(); it != graph[node].end(); ++ it)
        if(!vis[*it])
            dir.push_back(*it);
    countCliques();

    vis[node] = 1;
    for(it = graph[node].begin(); it != graph[node].end(); ++ it)
        if(!vis[*it])
            -- deg[*it];

    for(it = graph[node].begin(); it != graph[node].end(); ++ it)
        if(!vis[*it] && deg[*it] < 6) {
            dfs(*it);
            return;
        }
}

int main() {
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    int m, i, a, b;

    scanf("%d%d",&n,&m);
    for(i = 1; i <= m; ++ i) {
        scanf("%d%d",&a,&b);
        graph[a].insert(b);
        graph[b].insert(a);

        ++ deg[a];
        ++ deg[b];
    }

    for(i = 1; i <= n; ++ i)
        if(!vis[i] && deg[i] < 6)
            dfs(i);

    printf("%d %d\n",maxsz, cnt);
    return 0;
}