1142
一遍ac
//
// Created by ZhangXiaoYu_TJUT on 2020/7/15.
//
//如果只有一个节点的话且该节点没有邻接节点,直接输出yes。遍历给的第一个节点的所有邻接节点,如果这个邻接节点也是其他所有人的邻接节点,说明不是max
//关于是不是clique:用邻接表表示就可以了,如果e[i][j]==1说明联通,这样遍历所有给出的节点,就可以了。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int nv,ne,m,k;
int e[210][210];
int main(){
unordered_map<int,vector<int>>v; //用来存所有相邻顶点
cin>>nv>>ne;
int a,b;
while(ne--){
cin>>a>>b;
e[a][b]=e[b][a]=1;
v[a].push_back(b);
v[b].push_back(a);
}
cin>>m;
while(m--){
int flag =2;
cin>>k;
int tmp;
vector<int> ans;
for(int i=0;i<k;i++){
cin>>tmp;
ans.push_back(tmp);
}
if(k==1 && v[ans[0]].size()==0){ //如果只有一个数据而且这个数据没有邻接点
cout<<"Yes"<<endl;
continue;
}
int not_flag=0;
//flag 为0 表示not,为1表示not max,为2表示yes。假设是yes,接着判断如果不连通则0,如果联通但不是最大为1,除此之外说明假设成立
for(int i=0;i<ans.size();i++){ //遍历所有点
int tmp_flag=0;
for(int j=i+1;j<ans.size();j++){//判断询问的点是否连通
if(e[ans[i]][ans[j]]==0){
not_flag=1;
break;
}
}
if(not_flag)break;
}
if(not_flag){
cout<<"Not a Clique"<<endl;
continue;
}
//接下来判断该clique是否是maximal
a=ans[0];
int not_maximal = 0;
for(int i=0;i<v[a].size();i++){
int edge=1;
for(int j=1;j<ans.size();j++){
if(e[v[a][i]][ans[j]])edge++;
else break;
}
if(edge==ans.size()){
flag=1;
break;
}
// for(int j=0;j<v[i].size();j++){
// for(int l=0;l<ans.size()&& l!=i;l++){
// if()
// }
// }
}
if(flag==1)cout<<"Not Maximal"<<endl;
else cout<<"Yes"<<endl;
}
}