Cod sursa(job #1997806)

Utilizator lflorin29Florin Laiu lflorin29 Data 5 iulie 2017 13:44:20
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#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;
}