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, printNot Maximal
; or if it is not a clique at all, printNot a Clique
.Sample Input:
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
Sample Output:
Yes Yes Yes Yes Not Maximal Not a Clique
题意:给出有nv个点ne条边的无向图,共k次询问,问这些点构成的集合是否是完全图 / 最大完全图
思路:
- mp[a][b]=1,代表a和b之间有边,将每次询问的点集合放入v[205](下标为0到k-1),and flag[i]标记为1
- 两层for循环判断是否每两个点都有边——否则不是完全图
- 对任意一个不是询问点集中的点,依次判断是否与点集中所有点都有边,只要有一个不存在即可break,判断下一个
- 若当前判断到最后一个点则置标记不是最大完全图
- 否则是最大完全图
#include<bits/stdc++.h>
using namespace std;
int mp[205][205];
int nv;
void Check() {
int k,isMaximal=1;//初值!!!
vector<int> v(205);
int flag[205]= {0};
scanf("%d",&k);
for(int i=0; i<k; i++) {
scanf("%d",&v[i]);
flag[v[i]]=1; //i v[i]
}
for(int i=0; i<k; i++) {
for(int j=0; j<i; j++) {
if(mp[v[i]][v[j]]==0) {
printf("Not a Clique\n");
return;
}
}
}
for(int i=1; i<=nv; i++) {
if(flag[i]==0) {
for(int j=0; j<k; j++) {
if(mp[i][v[j]]==0) break; //只要有一个边不相连即不必判断
if(j==k-1) isMaximal=0; //到达最后一条边说明与不是最大的clique
}
}
if(isMaximal==0){
printf("Not Maximal\n");
return;
}
}
printf("Yes\n");
}
int main() {
int ne,m,a,b;
scanf("%d %d",&nv,&ne);
for(int i=1; i<=ne; i++) {
scanf("%d %d",&a,&b);
mp[a][b]=mp[b][a]=1;
}
scanf("%d",&m);
while(m--) {
Check();
}
return 0;
}