A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one more adjacent vertex. (Quoted from https://en.wikipedia.org/wiki/Clique_(graph_theory))
Now it is your job to judge if a given subset of vertices can form a maximal clique.
Each input file contains one test case. For each case, the first line gives two positive integers Nv (≤ 200), the number of vertices in the graph, and Ne, the number of undirected edges. Then Ne lines follow, each gives a pair of vertices of an edge. The vertices are numbered from 1 to Nv.
After the graph, there is another positive integer M (≤ 100). Then M lines of query follow, each first gives a positive number K (≤ Nv), then followed by a sequence of K distinct vertices. All the numbers in a line are separated by a space.
For each of the M queries, print in a line Yes if the given subset of vertices can form a maximal clique; or if it is a clique but not a maximal clique, print Not Maximal; or if it is not a clique at all, print Not a Clique.
- 8 10
- 5 6
- 7 8
- 6 4
- 3 6
- 4 5
- 2 3
- 8 2
- 2 7
- 5 3
- 3 4
- 6
- 4 5 4 3 6
- 3 2 8 7
- 2 2 3
- 1 1
- 3 4 3 6
- 3 3 2 1
- Yes
- Yes
- Yes
- Yes
- Not Maximal
- Not a Clique
- #include
- #include
- #include
- using namespace std;
- int ne, nv, m, k, u, v;
- int a[300];
- bool g[300][300];
- bool vis[300];
-
- int main() {
- cin >> nv >> ne;
- for (int i = 1; i <= nv; i++) {
- g[i][i] = 1;
- }
- for (int i = 0; i < ne; i++) {
- cin >> u >> v;
- g[u][v] = g[v][u] = 1;
- }
- cin >> m;
-
- while (m--) {
- cin >> k;
- int flag = 0;
- memset(vis, 0, sizeof(vis));
- for (int i = 0; i < k; i++) {
- cin >> a[i];
- vis[a[i]] = 1;
- }
- for (int i = 0; i < k; i++) {
- if (flag == 1) {
- break;
- }
- for (int j = i + 1; j < k; j++) {
- if (!g[a[i]][a[j]]) {
- flag = 1;
- break;
- }
- }
- }
- if (flag == 1) {
- cout << "Not a Clique" << endl;
- continue;
- }
- if (flag == 0) {
- for (int i = 1; i <= nv; i++) {
- if (flag == 2) {
- break;
- }
- if (!vis[i]) {
- vis[i] = 1;
- int j = 0;
- while (j < k && g[i][a[j]]) {
- j++;
- }
- if (j == k) {
- flag = 2;
- break;
- }
- }
- }
- }
- if (flag == 2) {
- cout << "Not Maximal" << endl;
- } else {
- cout << "Yes" << endl;
- }
- }
- return 0;
- }