#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
bool G[210][210];
vector<int> clique;
unordered_set<int> C;
int isClique(int n){
// 若这个序列里不是每个点互相都直接相连,返回3
// 若每个点互相都直接相连,但在外面发现了和里面每个点都直接相连的点,返回2
// 否则,返回1
int size = clique.size();
for(int i = 0;i < size - 1;i++){
for(int j = i + 1;j < size;j++){
if(G[clique[i]][clique[j]] == false)
return 3;
}
}
bool isMax = true; // 假设是max clique
for(int i = 1;i <= n;i++){
if(C.find(i) != C.end()) // 确保这个点不是已经给出的clique的点
continue;
bool findAPoint = true;
for(int j = 0;j < size;j++){
if(G[clique[j]][i] == false)
findAPoint = false;
}
if(findAPoint == true)
isMax = false;
}
if(isMax == true)
return 1;
return 2;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0;i < 210;i++)
for(int j = 0;j < 210;j++)
G[i][j] = false;
for(int i = 0;i < m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u][v] = G[v][u] = true;
}
int k;
scanf("%d",&k);
for(int i = 0;i < k;i++){
clique.clear();
C.clear();
int q;
scanf("%d",&q);
for(int j = 0;j < q;j++){
int temp;
scanf("%d",&temp);
clique.push_back(temp);
C.insert(temp);
}
int res = isClique(n);
if(res == 1)
printf("Yes\n");
else if(res == 2)
printf("Not Maximal\n");
else
printf("Not a Clique\n");
}
system("pause");
return 0;
}
PAT | A1142 Maximal Clique
最新推荐文章于 2024-03-08 11:47:08 发布