Cod sursa(job #1834614)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 24 decembrie 2016 20:03:21
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("count.in");
ofstream g("count.out");

const int NMAX = 30005;

int n, m;
int max_clq;
int cnt_clq[5];
set <int> G[NMAX];

class Cp {
    public:
        inline bool operator () (int i, int j) {
            if (G[i].size() == G[j].size()) {
                return i < j;
            }
            else {
                return G[i].size() < G[j].size();
            }
        }
};

multiset <int, Cp> s;
bool d[5][5];

void findCliques(vector <int> &v) {
    int size = v.size();
    for (int i = 0; i < size; i++) {
        for (int j = i + 1; j < size; j++) {
            d[i][j] = (G[v[i]].find(v[j]) != G[v[i]].end());
        }
    }
    for (int i = 1; i < (1 << size); i++) {
        int c = __builtin_popcount(i) + 1;
        if (c >= max_clq) {
            bool is_clq = true;
            for (int j = 0; is_clq == true && j < size; j++) {
                if ((i >> j) & 1) {
                    for (int k = j + 1; is_clq == true && k < size; k++) {
                        if ((i >> k) & 1) {
                            is_clq &= d[j][k];
                        }
                    }
                }
            }
            if (is_clq == true) {
                max_clq = max(max_clq, c);
                cnt_clq[c]++;
            }
        }
    }
}

void planarDec() {
    for (int i = 1; i <= n; i++) {
        s.insert(i);
    }
    while (s.empty() == false) {
        int u = *s.begin();
        s.erase(s.begin());
        vector <int> c;
        while (G[u].empty() == false) {
            int v = *G[u].begin();
            s.erase(s.find(v));
            G[u].erase(G[u].begin());
            G[v].erase(G[v].find(u));
            c.push_back(v);
            s.insert(v);
        }
        findCliques(c);
    }
}

int main() {
    f >> n >> m;
    while (m--) {
        int u, v;
        f >> u >> v;
        G[u].insert(v);
        G[v].insert(u);
    }
    planarDec();
    g << max_clq << " " << cnt_clq[max_clq] << "\n";
    return 0;
}