先判断是否是clique,即判断是否任意两边都相连;之后判断是否是maximal,即遍历所有不在集合中的剩余的点,看是否存在一个点满足和集合中所有的结点相连,最后如果都满足,那就输出Yes表示是Maximal clique。
const int N=210;
bool g[N][N];
int v[N];
bool vis[N];
int n,m,q;
int main()
{
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
g[a][b]=g[b][a]=true;
}
cin>>q;
while(q--)
{
int k;
cin>>k;
for(int i=0;i<k;i++) cin>>v[i];
bool ok=true;
int cnt=0;
for(int i=0;i<k;i++)
for(int j=i+1;j<k;j++)
{
int a=v[i],b=v[j];
if(g[a][b]) cnt++;
}
if(cnt == k*(k-1)/2)
{
for(int i=1;i<=n;i++)
{
vis[i]=true;
for(int j=0;j<k;j++)
{
int x=v[j];
if(!g[i][x]) vis[i]=false;
}
}
bool ok=true;
for(int i=1;i<=n;i++)
if(vis[i])
{
ok=false;
break;
}
if(ok) puts("Yes");
else puts("Not Maximal");
}
else puts("Not a Clique");
}
//system("pause");
return 0;
}