一、题目概述
判定给定的顶点集的性质。
Clique的定义:定点集中,任意一对顶点都相互邻接。其中若加入任意其他顶点则失去Clique的性质即为Maximum Clique。
二、思路
判定逻辑:
对给定顶点集中顶点迭代,第i次迭代:
(1)检查下标为i的顶点的被访问次数。若下标为i的顶点的被访问次数不是i,则该顶点与下标为0~i- 1的至少一个顶点不邻接,该顶点集不是Clique
(2)访问下标为i的顶点的所有邻接顶点。若有顶点被访问到K(顶点集中顶点数)次,则该Clique可拓展。
三、代码
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
int Nv, Ne, M;
scanf("%d %d", &Nv, &Ne);
vector<vector<int>> G(Nv + 1);
for( int i = 0, v1, v2; i < Ne; ++i )
{
scanf("%d %d", &v1, &v2);
G[v1].push_back(v2);
G[v2].push_back(v1);
}
scanf("%d", &M);
for( int i = 0, K, extendible, flag; i < M; ++i )
{
scanf("%d", &K);
extendible = 0;
flag = 1;
vector<int> a(K), visited(Nv + 1, 0);
for( int j = 0; j < K; ++j )
{
scanf("%d", &a[j]);
if( visited[a[j]] != j )
flag = 0;
for( int k = 0; k < G[a[j]].size(); ++k )
if( ++visited[G[a[j]][k]] == K )
extendible = 1;
}
printf("%s\n", flag ? extendible ? "Not Maximal":"Yes" : "Not a Clique");
}
}