笨方法写的
理论上不难
老是给自己找问题,其实很简单就解决了
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cstring>
#include <cmath>
#include <map>
using namespace std;
int n,m,k;
int inf = 99999999;
int edge[220][220];
int in[220];
vector<int> node[220];
int main()
{
cin >> n >> m;
fill(edge[0],edge[0]+220*220,inf);
for(int i=0; i<m; i++){
int a,b;
cin >> a >> b;
edge[a][b] = edge[b][a] = 1;
node[a].push_back(b);
node[b].push_back(a);
}
cin >> k;
for(int i=0; i<k; i++){
int kk;
int flagm = 1, flagc = 1;
fill(in,in+220,-1);
cin >> kk;
vector<int> ans(kk);
for(int j=0; j<kk; j++){
cin >> ans[j];
in[ans[j]] = 1;
}
for(int j=0; j<kk; j++){
for(int l=j+1; l<kk; l++){
if(edge[ans[j]][ans[l]]!=1){
flagm = 0;
break;
}
}
if(flagm==0) break;
}
if(flagm==0){
cout << "Not a Clique" << endl;
continue;
}
int flagn = 1, flagh = 0;
for(int j=0; j<kk; j++){
flagh = 0;
flagn = 1;
for(int l=0; l<node[ans[j]].size(); l++){
if(in[node[ans[j]][l]]==-1){
flagh = 1;
for(int p=0 ;p<kk; p++){
if(edge[ans[p]][node[ans[j]][l]]!=1){
flagn = 0;
break;
}
}
}
}
if(flagh==1&&flagn==1) break;
}
if(flagn==1&&flagh==1) flagc = 0;
if(flagc==1&&flagm==1) cout << "Yes" << endl;
if(flagc==0&&flagm==1) cout << "Not Maximal" << endl;
}
return 0;
}