AcWing 1635. 最大团
原题链接
简单
作者:
leo123456
,
2020-08-28 15:59:47
,
所有人可见
,
阅读 757
题目描述
#include<iostream>
#include<cstring>
using namespace std;
const int N=210;
int n,m;
bool g[N][N],st[N]; //存边和已经存在的点
int vers[N];//存点
bool check_clique(int cnt)
{
for(int i=cnt-1;i>0;i--) //判断是不是数组的两两都有边
for(int j=0;j<i;j++)
if(!g[vers[i]][vers[j]])
return false;
return true;
}
bool check_maximum(int cnt)
{
memset(st,0,sizeof st);
for(int i=0;i<cnt;i++)
st[vers[i]]=true;
for(int i=1;i<=n;i++)
if(!st[i])
{
bool success=true;
for(int j=0;j<cnt;j++)
if(!g[i][vers[j]])
{
success=false;
break;
}
if(success) return false;
}
return true;
}
int main()
{
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
g[a][b]=g[b][a]=true;
}
int k;
cin>>k;
while(k--)
{
int cnt;
cin>>cnt;
for(int i=0;i<cnt;i++) cin>>vers[i];
if(check_clique(cnt))
{
if(check_maximum(cnt)) cout<<"Yes"<<endl;
else cout<<"Not Maximal"<<endl;
}
else cout<<"Not a Clique"<<endl;
}
return 0;
}