思路:
1.用map的映射关系存储邻接矩阵;
2.先遍历所有给的点,比较是否邻接,以此判断是不是团;
3.若是团,则遍历所有团中结点,若结点的相邻节点数不等于k-1,则删去团中k-1个结点,将剩下的结点与团中结点比较,比较是否都相邻;
代码:
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
int main(){
int nv,ne,m;
scanf("%d%d",&nv,&ne);
vector<unordered_set<int>> mat(nv+1);
for(int i=0;i<ne;i++){
int v1,v2;
scanf("%d%d",&v1,&v2);
mat[v1].insert(v2);
mat[v2].insert(v1);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
int n,j,k;
scanf("%d",&n);
vector<int> v(n);
for(j=0;j<n;j++)
scanf("%d",&v[j]);
for(j=0;j<n-1;j++){
for(k=j+1;k<n;k++)
if(mat[v[j]].find(v[k])==mat[v[j]].end())
break;
if(k!=n) break;
}
if(j!=n-1){
printf("Not a Clique\n");
continue;
}
vector<unordered_set<int>> mat1(mat);
for(auto e:v){
if(mat1[e].size()!=n-1){
for(j=0;j<n;j++)
if(v[j]!=e) mat1[e].erase(v[j]);
for(auto p:mat1[e]){
for(j=0;j<n;j++)
if(mat[p].find(v[j])==mat[p].end())
break;
if(j==n) break;
}
if(j==n) break;
}
}
j==n?printf("Not Maximal\n"):printf("Yes\n");
}
return 0;
}