Cod sursa(job #1681227)

Utilizator vladrochianVlad Rochian vladrochian Data 9 aprilie 2016 12:28:34
Problema Count Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#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;
}