题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805343979159552
题意
题目中的Clique是一个点集合,里面的点在给定的图中两两相邻
而 Maximal Clique 就是指如果再向这个点集合中加入图中的其他任意点,无法满足两两相邻的条件,因此当前的点集合就是最大的
题目解析
将给定的边记录在图f中,通过两两比较判断待测序列的点是否符合Clique的条件
如果符合再遍历其它(不在待测序列中的)点,是否和待测序列中的所有点相连,如果存在一个这样的点,这个序列就不是Maximal Clique,否则是
AC代码
#include<bits/stdc++.h>
using namespace std;
int f[201][201],vis[201];
int nv,ne,m;
int main()
{
scanf("%d %d",&nv,&ne);
while(ne--)
{
int x,y;
scanf("%d %d",&x,&y);
f[x][y]=f[y][x]=1;
}
cin>>m;
while(m--)
{
int n,clique=1,maxn=1;
cin>>n;
int a[n];
fill(vis,vis+201,0);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
vis[a[i]]=1;
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(f[a[i]][a[j]]==0) clique=0;
if(clique)
for(int i=1;i<=nv;i++)
{
if(vis[i]==0)
{
int j;
for(j=0;j<n;j++)
if(f[i][a[j]]==0) break;
if(j==n)
{
maxn=0;
break;
}
}
}
if(clique&&maxn) printf("Yes\n");
else if(clique&&!maxn) printf("Not Maximal\n");
else printf("Not a Clique\n");
}
}