Pagini recente » Monitorul de evaluare | Cod sursa (job #2283492) | Cod sursa (job #1762544) | Monitorul de evaluare | Cod sursa (job #1834614)
#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;
}