我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805343979159552
题目描述:
题目翻译:
1142 最大Clique
clique是无向图的顶点的子集,使得clique中的每两个不同的顶点是相连接的。最大clique是包括一个或多个相邻顶点的且无法扩展的clique。(引用自https://en.wikipedia.org/wiki/Clique_(graph_theory))
现在你的任务是判断给定的顶点子集是否可以形成最大clique。
输入格式:
每个输入文件包含一个测试用例。对每个测试用例,第一行给出两个正整数Nv(<= 200),代表图中的顶点数,以及Ne,即无向边的数量。然后紧跟着Ne行,每行给出一条边的一对顶点。顶点编号从1到Nv。
在图之后,还有另一个正整数M(<= 100)。然后紧跟着M行查询,每行首先给出正数K(<= Nv),然后是一系列K个不同顶点。一行中的所有数字都用空格分隔。
输出格式:
对于M个查询中的每个查询,如果给定的顶点子集可以形成最大clique,则在行中打印“Yes”。如果它是一个clique而不是一个最大clique,则打印“Not Maximal”;如果它根本不是一个clique,打印“Not a Clique”。
输入样例:
8 10
5 6
7 8
6 4
3 6
4 5
2 3
8 2
2 7
5 3
3 4
6
4 5 4 3 6
3 2 8 7
2 2 3
1 1
3 4 3 6
3 3 2 1
输出样例:
Yes
Yes
Yes
Yes
Not Maximal
Not a Clique
知识点:set集合的应用
思路:为了查找的速度,用set集合来保存每个顶点的相连顶点
首先判断所给集合中两两是不是都存在边,以此来判断所给集合是不是一个clique。
接着遍历不在当前clique中的所有顶点,如果能发现新的能加入clique的节点,说明当前clique不是一个最大clique。
时间复杂度和所给查询的集合大小有关以及图中各顶点的连接边有关。空间复杂度是O(Nv + Ne)。
C++代码:
#include<iostream>
#include<set>
using namespace std;
set<int> graph[201];
int main(){
int Nv, Ne;
scanf("%d %d", &Nv, &Ne);
int v1, v2;
for(int i = 0; i < Ne; i++){
scanf("%d %d", &v1, &v2);
graph[v1].insert(v2);
graph[v2].insert(v1);
}
int M;
scanf("%d", &M);
for(int i = 0; i < M; i++){
int K;
scanf("%d", &K);
int nums[K];
set<int> numSet;
for(int j = 0; j < K; j++){
scanf("%d", &nums[j]);
numSet.insert(nums[j]);
}
bool flag = true; //判断其是否是一个clique
for(int j = 0; j < K; j++){
for(int k = j + 1; k < K; k++){
if(graph[nums[j]].find(nums[k]) == graph[nums[j]].end()){
flag = false;
break;
}
}
if(!flag){
break;
}
}
if(!flag){
printf("Not a Clique\n");
}else{
bool flag2 = true; //判断是否是最大clique
for(int j = 1; j <= Nv; j++){
if(numSet.find(j) != numSet.end()){
continue;
}
bool flag3 = true; //判断该点j能否加入到clique中
for(int k = 0; k < K; k++){
if(graph[j].find(nums[k]) == graph[j].end()){
flag3 = false;
break;
}
}
if(flag3){ //一旦发现还有额外的顶点可以加入clique中
flag2 = false; //说明当前clique并不是一个最大clique
break;
}
}
if(!flag2){
printf("Not Maximal\n");
}else{
printf("Yes\n");
}
}
}
return 0;
}
C++解题报告: