Cod sursa(job #1138503)

Utilizator smaraldaSmaranda Dinu smaralda Data 10 martie 2014 09:55:02
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<stdio.h>
#include<vector>
#include<bitset>
#include<algorithm>
#include<unordered_set>
using namespace std;
 
const int NMAX = 3e5;
 
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) {
    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;
}