A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one more adjacent vertex.
clique 无向图顶点的子集,这其中任何两点均相邻(能成边)
所以这就是 最大完全图吧
先判断是否是 clique ,即判断是否任意两边都相连;之后判断是否是 maximal ,即遍历所有不在 集合中的剩余的点,看是否存在⼀个点满⾜和集合中所有的结点相连
之前做的现在一看居然想不出来怎么判断max了 ,老了
#include<bits/stdc++.h>
using namespace std;
const int maxn=210;
int g[maxn][maxn];
int d[maxn];
int main(){
int nv,ne;
scanf("%d %d",&nv,&ne);
fill(g[0],g[0]+maxn*maxn,0);
for(int i=0;i<ne;i++){
int x,y;
scanf("%d %d",&x,&y);
g[x][y]=1;g[y][x]=1;
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
int k;bool flag=true;
scanf("%d",&k);
for(int j=0;j<k;j++){
scanf("%d",&d[j]);
//1、遍历前面的,要求全部相连
if(flag)
for(int t=0;t<j;t++){
if(g[d[t]][d[j]]==0) flag=false;
}
}
if(!flag) printf("Not a Clique\n");
else{
//2、看是否可以扩充,如果有点hash[I]=k那么不是最大
bool max=false;int hash[maxn]={0};
for(int j=0;j<k;j++){
for(int t=1;t<=nv;t++){
if(g[d[j]][t]) hash[t]++;
}
}
for(int j=1;j<=nv;j++){
if(hash[j]==k) max=true;
}
if(max) printf("Not Maximal\n");
else printf("Yes\n");
}
}
return 0;
}