题意:
给定无向图,再给一个点集,问是不是 MC,C,或者两者都不是
思路:1142 Maximal Clique (25 分)
C就是给定的点集中任意两个点直接相连
MC就是不存在其他点,跟点集中的所有点相连
MC 包含于 C 这样的关系
应当先判断两者都不是的情况
#include<bits/stdc++.h>
#include<cstring>
#define FI first
#define SE second
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 200 + 7;
int n, m, q, n_;
int a[maxn];
int d[maxn][maxn];
bool vis[maxn];
bool not_c() {
for(int i = 1; i <= n_; ++i) {
for(int j = i+1; j <= n_; ++j) {
if(!d[a[i]][a[j]]) return true;
}
}
return false;
}
bool not_m() {
memset(vis, 0, sizeof vis);
for(int i = 1; i <= n_; ++i) vis[a[i]] = 1;
for(int i = 1; i <= n; ++i) {
if(vis[i]) continue;
bool f = true;
for(int j = 1; j <= n_; ++j) {
if(!d[i][a[j]]) {
f = false;
}
}
//cout << i << "+" << f << endl;
if(f) return true;
}
return false;
}
void solve() {
//cout << " -------------- " << endl;
scanf("%d", &n_);
for(int i = 1; i <= n_; ++i) {
scanf("%d", &a[i]);
}
if(not_c()) {
puts("Not a Clique");
}
else if(not_m()){
puts("Not Maximal");
}
else {
puts("Yes");
}
}
int main() {
scanf("%d%d", &n, &m);
int u, v;
for(int i = 1; i <= m; ++i) {
scanf("%d%d", &u, &v);
d[u][v] = d[v][u] = 1;
}
scanf("%d", &q);
for(int i = 1; i <= q; ++i) {
solve();
}
return 0;
}