题意
给定几个点,判断是否为极大团,即每两个顶点都有边连接。
- 判断给定的点是否两两都有边,将题目中的所给的测试顶点的所有邻接的点都加1,最后在这几个点循环看一下每个点入度是否等于k-1(顶点数减1),如果是则为团。
- 然后如果存在一个点,使得其不为极大团,则必有一个或多个不在给出的数据里面的点,其入度为k
code
#include <bits/stdc++.h>
using namespace std;
vector<int> g[210];
int main(){
int n,m,u,v,k;
cin>>n>>m;
while(m--){
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
cin>>m;
for(int i=0;i<m;i++){
vector<int> d(n+1,0),a;
int cnt=0,judge=1;
cin>>k;
for(int i=0;i<k;i++){
cin>>u;
a.push_back(u);
for(int i=0;i<g[u].size();i++) d[g[u][i]]++;
}
for(int i=0;i<a.size();i++) if(d[a[i]]==k-1) cnt++;
if(cnt<k){
cout<<"Not a Clique"<<endl;
continue;
}
for(int i=1;i<=n;i++) if(d[i]==k){
judge=0;
break;
}
if(judge) cout<<"Yes"<<endl;
else cout<<"Not Maximal"<<endl;
}
return 0;
}