The optimal solution is like this because in a complete graph there are 2^n cliques. Consider all subsets of nodes using a recursive function. And for each subset if all the edges are present between nodes of the subset, add 1 to your counter: (This is almost a pseudocode in C++)
int clique_counter = 0;
int n; //number of nodes in graph
//i imagine nodes are numbered from 1 to n
void f(int x, vector <int> &v){ //x is the current node
if(x == n){
bool is_clique = true;
for(int i = 0; i < v.size(); i++){
for(int j = i + 1; j < v.size(); j++){
if(there is not an edge between node v[i] and v[j]) //it can't be clique
is_clique = false;
}
}
if(is_clique == true){
clique_counter++;
}
return;
}
//if x < n
f(x + 1, v);
v.push_back(x);
f(x + 1, v);
v.pop_back();
}
int main(){
vector <int> v;
f(1, v);
cout << clique_counter << endl;
return 0;
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…