Cod sursa(job #1981447)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 15 mai 2017 19:00:08
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <unordered_set>
#include <queue>
using namespace std;

const int dim = 30005;
typedef unordered_set< int >::iterator sit;

ifstream fin("count.in");
ofstream fout("count.out");

unordered_set<int> L[dim];

queue<int> Q;

int Degree[dim];
int SOL[6]; //in SOL[i]: nr de clici cu i noduri

int n, m, x, y;

int main() {
	fin >> n >> m;
	for (int i = 1; i <= m; ++i) {
		fin >> x >> y;
		L[x].insert(y);
		L[y].insert(x);
		++Degree[x];
		++Degree[y];
	}

	SOL[1] = n;    //clici cu un nod
	SOL[2] = m;    //clici cu doua noduri
	for (int i = 1; i <= n; ++i)
		if (Degree[i] < 6)
			Q.push(i);
	while (!Q.empty()) {
		int nod = Q.front();
		Q.pop();
		for (sit it1 = L[nod].begin(); it1 != L[nod].end(); ++it1) {
			for (sit it2 = it1; it2 != L[nod].end(); ++it2) {
				if (it1 == it2 || L[*it1].find(*it2) == L[*it1].end())
					continue;
				++SOL[3]; //am gasit o clica de dimensiune 3
				for (sit it3 = it2; it3 != L[nod].end(); ++it3) {
					if (it2 == it3 || L[*it1].find(*it3) == L[*it1].end() || L[*it2].find(*it3) == L[*it2].end())
						continue;
					++SOL[4]; //am gasit o clica de dimensiune 4
				}
			}
		}
		for (sit it = L[nod].begin(); it != L[nod].end(); ++it) {
			--Degree[*it];
			if (Degree[*it] == 5)
				Q.push(*it);
			L[*it].erase(nod); //stergem nodul din listele tuturor vecinilor sai
		}
	}
	for (int i = 4; i; --i) {
		if (SOL[i]) {
			fout << i << " " << SOL[i];
			return 0;
		}
	}
	return 0;
}