#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int nv,ne,m; //点数,边数
int g[maxn][maxn]={0}; //对于无向边,几乎都是要用二维数组来判断两两节点是否导通!!!
int vis[maxn]={0},num[maxn]={0};
int judge(int test[],int k){ //核心!! 对于此题,先判断所给测试节点集合两两间是否导通;
int ans; //之后,判断能否把其他某一测试节点外(此处必用vis数组,作用为
for(int i=0;i<k;i++){ //区分两堆集合:是否为被测试点)的数组加入来形成环, 若不能,则为Yes!!!!
int node=test[i];
for(int j=0;j<k;j++){
if(g[node][test[j]]!=1) {
return -1;
}
}
}
for(int i=1;i<=nv;i++){//核心中的重点:判断测试集合外是否有顶点与测试集合内的点都能联通,若没有则为Yes。
if(vis[i]==0){
for(int j=0;j<k;j++){
int node=test[j];
if(g[i][node]!=1){
break;
}
if(j==k-1){
return 0;
}
}
}
if(i==nv) return 1;
}
}
int main(){
scanf("%d%d",&nv,&ne);
for(int i=1;i<=nv;i++){
g[i][i]=1;
}
for(int i=0;i<ne;i++){
int a,b;
scanf("%d%d",&a,&b);
g[a][b]=1;g[b][a]=1;
}
scanf("%d",&m);
for(int i=0;i<m;i++){
int k,test[205]={0};
fill(vis,vis+205,0);
scanf("%d",&k);
for(int j=0;j<k;j++){
scanf("%d",&test[j]);
vis[test[j]]++;
}
int ans=judge(test,k);
if(ans==1){
printf("Yes\n");
} else if(ans==0){
printf("Not Maximal\n");
} else {
printf("Not a Clique\n");
}
}
return 0;
}
1142 Maximal Clique (25)
最新推荐文章于 2021-08-21 15:53:43 发布