Pagini recente » Cod sursa (job #3200651) | Cod sursa (job #2990293) | Runda 1 preONI 2007 | Cod sursa (job #1634806) | Cod sursa (job #1681227)
#include <fstream>
#include <vector>
#include <unordered_set>
using namespace std;
const int N_MAX = 3e4;
ifstream fin("count.in");
ofstream fout("count.out");
int N, M;
unordered_set<int> G[N_MAX + 5];
unordered_set<int> s;
bool use[N_MAX + 5];
vector<int> st;
int max_clique, clique_count;
bool Check(int node) {
for (int i : st)
if (node < i || !G[node].count(i))
return false;
return true;
}
void Back(const unordered_set<int>& al, int size) {
if (size > max_clique) {
max_clique = size;
clique_count = 1;
} else if (size == max_clique) {
++clique_count;
}
for (int i : al)
if (Check(i)) {
st.push_back(i);
Back(al, size + 1);
st.pop_back();
}
}
int main() {
fin >> N >> M;
while (M--) {
int x, y;
fin >> x >> y;
G[x].insert(y);
G[y].insert(x);
}
for (int i = 1; i <= N; ++i)
if (G[i].size() < 6)
s.insert(i);
while (!s.empty()) {
int node = *s.begin();
s.erase(s.begin());
Back(G[node], 1);
for (int i : G[node]) {
G[i].erase(node);
if (G[i].size() < 6)
s.insert(i);
}
}
fout << max_clique << " " << clique_count << "\n";
return 0;
}