/*
问题1:如何判断clique 数据结构和算法:二维数组存储两个点是否连接
问题2:如何判断maxclique 数据结构和算法:(1)map vector现存储图中每一个不同的点 (2)map vector现存储子图中每一个不同的点
(3)向子图中加入一个子图中没有的点(来自母图),判断其是否是clique
*/
#include <vector>
#include <unordered_map>
#include <iostream>
#include <algorithm>
#include <map>
#define max 200
using namespace std;
bool IsAdjacent[max][max];
bool IsClique(vector<int> v){
for (int i = 0; i < v.size(); i++) {
for (int j = i + 1; j < v.size(); j++) {
if(IsAdjacent[v[i]][v[j]] == false){
return false;
}
}
}
return true;
}
int main()
{
int nv;
int ne;
scanf("%d %d", &nv, &ne);
unordered_map<int, bool> ma;
vector<int> vertices;
for(int i = 0; i < ne; i++){
int a, b;
scanf("%d %d", &a, &b);
IsAdjacent[a][b] = true;
IsAdjacent[b][a] = true;
//vertices中存入所有不同点
if(!ma[a]){
vertices.push_back(a);
}
if (!ma[b]) {
vertices.push_back(b);
}
ma[a] = true;
ma[b] = true;
}
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++) {
int k;
scanf("%d", &k);
vector<int> v;
unordered_map<int, bool> mb;
for (int j = 0; j < k; j++) {
int t;
scanf("%d", &t);
v.push_back(t);
mb[t] = true;
}
//判断是否连通
bool isClique = IsClique(v);
//判断是否最大连通
bool isMaxClique;
if (isClique) {
isMaxClique = true;
}else{
isMaxClique = false;
}
if (isClique) {
for (int i = 0; i < vertices.size(); i++) {
if(!mb[vertices[i]]){
v.push_back(vertices[i]);//加入
if (IsClique(v)) {
isMaxClique = false;
break;
}
v.pop_back();//踢出
}
}
}
if (isMaxClique) {
printf("Yes\n");
}else if(isClique){
printf("Not Maximal\n");
}else{
printf("Not a Clique\n");
}
}
}
1142. Maximal Clique (25)
最新推荐文章于 2022-02-15 22:51:55 发布