Pagini recente » Cod sursa (job #1310430) | Cod sursa (job #20307) | Cod sursa (job #2547839) | Cod sursa (job #607507) | Cod sursa (job #1997806)
#include <bits/stdc++.h>
using namespace std;
const int N = 3e4 + 5;
int n, m, best, cntbest;
set <int> g[N];
queue<int>q;
vector<int>take_clique;
bool isClique() {
for (int i = 0; i < take_clique.size(); ++i) {
int a = take_clique[i];
for (int j = i + 1; j < take_clique.size(); ++j) {
int b = take_clique[j];
if (g[a].find(b) == end(g[a])) {
return false;
}
}
}
return true;
}
void backk(int node, int level, const vector <int>& adj) {
if (level == adj.size()) {
if (isClique()) {
if (take_clique.size() + 1 > best) {
best = take_clique.size() + 1;
cntbest = 1;
}
else if (take_clique.size() + 1 == best) {
++cntbest;
}
}
}
else {
backk(node, level + 1, adj);
take_clique.push_back(adj[level]);
backk(node, level + 1, adj);
take_clique.pop_back();
}
}
int main() {
ifstream cin("count.in");
ofstream cout("count.out");
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b;
cin >> a >> b;
a--;
b--;
g[a].insert(b);
g[b].insert(a);
}
vector<bool>viz(n);
for (int i = 0; i < n; ++i)
if (g[i].size() < 6)q.push(i), viz[i] = true;
while (!q.empty()) {
int curr = q.front();
q.pop();
vector<int>adj;
for (auto &i : g[curr])
adj.push_back(i);
backk(curr, 0, adj);
for (auto &i : g[curr]) {
auto itr = g[i].find(curr);
g[i].erase(itr);
}
for (auto &i : g[curr]) {
if (g[i].size() < 6 && !viz[i]) {
q.push(i);
viz[i] = true;
}
}
g[curr].clear();
}
cout << best << ' ' << cntbest;
}