思路:
1. 利用 map 统计查询里的结点出现的次数,当查询结点出现在图中时加1,当查询结点出现在邻接结点时加1;
2. 统计 map 中出现次数为 K(查询结点数) 的结点数量 KGraph,附加条件(同时处于查询结点中)KQuery,当 KGraph == KQuery 时,为最大 clique,
否则不是 Max clique,如果 KQuery < K 则 not a clique。
1142 Maximal Clique (25 point(s))
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.
Input Specification:
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.
Output Specification:
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
.
Example:
#include<iostream>
#include<vector>
#include<set>
#include<map>
using namespace std;
struct Graph {
int Nv;
int Ne;
vector<set<int>> G;
};
int main()
{
Graph G;
cin >> G.Nv >> G.Ne;
G.G.resize(G.Nv+1);
for(int i = 0; i < G.Ne; i++) {
int v1, v2;
cin >> v1 >> v2;
G.G[v1].insert(v2);
G.G[v2].insert(v1);
}
int M;
cin >> M;
map<int, int> m;
set<int> v;
for(int i = 0; i < M; i++) {
int K;
cin >> K;
v.clear();
m.clear();
for(int j = 0; j < K; j++) {
int num;
cin >> num;
v.insert(num);
m[num]++;
for(auto x : G.G[num]) {
m[x]++;
}
}
int KQuery = 0, KGraph = 0;
for(auto x : m) {
if(x.second == K) {
KGraph++;
if(v.count(x.first) != 0) {
KQuery++;
}
}
}
if(KQuery < v.size()) {
cout << "Not a Clique\n";
} else {
if(KQuery == KGraph) {
cout << "Yes\n";
} else {
cout << "Not Maximal\n";
}
}
}
}