#include <iostream>
#include <vector>
using namespace std;
int n;
vector<vector<bool>> graph;
// checks if the subgraph formed by the given
// vertices is a complete graph or not
bool IsClique(vector<int>& vertices) {
int size = vertices.size();
for(int i = 0; i < size; ++i) {
int u = vertices[i];
for(int j = i + 1; j < size; ++j) {
int v = vertices[j];
if(graph[u][v] == false) {
return false;
}
}
}
return true;
}
vector<int> maximum_clique;
int count = 0;
void FindMaximumClique(int index, vector<int> vertices) {
// we have reached the end of the list
if(index > n) {
if(vertices.size() > 0 && IsClique(vertices)) {
if(vertices.size() > maximum_clique.size()) {
maximum_clique = vertices;
}
count += 1;
//cout<<"Clique #"<<count<<": ";
// for(int num : vertices)
// cout<<num<<" ";
// cout<<endl;
}
return ;
}
// Skip the current vertex
FindMaximumClique(index + 1, vertices);
// Add the current vertex into the list
vertices.push_back(index);
FindMaximumClique(index + 1, vertices);
}
int main() {
cout<<"Enter number of vertices: ";
cin>>n;
cout<<"Enter the graph as an adjacency matrix: "<<endl;
graph = vector<vector<bool>>(n + 1, vector<bool>(n + 1));
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
int value;
cin>>value;
graph[i][j] = value;
}
}
cout<<endl;
FindMaximumClique(1, {});
cout<<"\nMaximum Clique is of size "<<maximum_clique.size()<<endl;
for(int num : maximum_clique) {
cout<<num<<" ";
}
cout<<endl;
}
Comments
Post a Comment