【PAT甲级】1142 Maximal Clique

简介: 【PAT甲级】1142 Maximal Clique

1142 Maximal Clique

A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one more adjacent vertex. (Quoted from https://en.wikipedia.org/wiki/Clique_(graph_theory))


Now it is your job to judge if a given subset of vertices can form a maximal clique.


Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers Nv (≤ 200), the number of vertices in the graph, and Ne, the number of undirected edges. Then Ne lines follow, each gives a pair of vertices of an edge. The vertices are numbered from 1 to Nv.


After the graph, there is another positive integer M (≤ 100). Then M lines of query follow, each first gives a positive number K (≤ Nv), then followed by a sequence of K distinct vertices. All the numbers in a line are separated by a space.


Output Specification:

For each of the M queries, print in a line Yes if the given subset of vertices can form a maximal clique; or if it is a clique but not a maximal clique, print Not Maximal; or if it is not a clique at all, print Not a Clique.


Sample Input:

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


Sample Output:

Yes
Yes
Yes
Yes
Not Maximal
Not a Clique


题意

在一个无向图中,如果一个顶点子集满足子集内的任意两个不同顶点之间都是相连的,那么这个顶点子集就被称为一个团。


如果一个团不能通过加入某个新的顶点来扩展成一个更大的团,那么该团就被称为最大团。


现在,你需要判断给定顶点子集能否构成一个最大团。


举个例子,下图中 [1,2,3,4] 就是该图的最大团,而 5 不在其中是因为 5 与 3 和 2 没有边。

思路

1.这题用邻接矩阵来存储每一条边。

2.每次询问时用数组 vers 去存储每个点值,并用 cnt 记录点数。然后先判判断该子集是否是团,如果是团再进一步判断是否为最大团。

1.判断是否是团,只需判断子集中每个点之间是否都存在边。

2.判断是否为最大团,需要先用一个数组 st 来标记子集中有哪些点,然后再遍历不是子集中的点,再去判断这些点是否和子集中的每个点都存在一条边,只要能找到一个这种点,就说明不是最大团。

3.根据判断结果,输出对应语句。


代码

#include<bits/stdc++.h>
using namespace std;
const int N = 210;
int g[N][N];
int vers[N];
bool st[N];
int n, m;
//判断是不是团
bool check_clique(int cnt)
{
    //判断每个点之间是否都存在边
    for (int i = 0; i < cnt; i++)
        for (int j = 0; j < i; j++)
            if (!g[vers[i]][vers[j]])
                return false;
    return true;
}
//判断是不是最大团
bool check_maximum(int cnt)
{
    memset(st, 0, sizeof st); //初始化
    //先将子集中的点进行标记
    for (int i = 0; i < cnt; i++)  st[vers[i]] = true;
    //然后遍历不在子集中的点
    for (int i = 1; i <= n; i++)
        if (!st[i])
        {
            //判断该点是否与子集中的所有点都有边
            bool success = true;
            for (int j = 0; j < cnt; j++)
                if (!g[i][vers[j]])
                {
                    //只要子集中有一个点与其没边,该点就不属于该团
                    success = false;
                    break;
                }
            //根据遍历结果判断是否为最大团
            if (success) return false;
        }
    return true;
}
int main()
{
    cin >> n >> m;
    //记录每条边
    for (int i = 0; i < m; i++)
    {
        int a, b;
        cin >> a >> b;
        g[a][b] = g[b][a] = true;
    }
    //开始查询
    int k;
    cin >> k;
    while (k--)
    {
        int cnt;
        cin >> cnt;
        for (int i = 0; i < cnt; i++)    cin >> vers[i];   //输入子集
        //判断是不是团
        if (check_clique(cnt))
        {
            //判断是不是最大团
            if (check_maximum(cnt))  puts("Yes");
            else    puts("Not Maximal");
        }
        else    puts("Not a Clique");
    }
    return 0;
}


目录
相关文章
|
机器学习/深度学习 算法 数据挖掘
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
**摘要:** 了解9种距离和相似度算法:欧氏距离、余弦相似度、汉明距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、雅卡尔指数、半正矢距离和Sørensen-Dice系数。这些算法在机器学习、文本分析、图像处理和生物学等领域各有应用。例如,欧氏距离用于KNN和K-Means,余弦相似度用于文本相似性,汉明距离在错误检测中,曼哈顿距离在数据挖掘,切比雪夫距离在棋盘游戏,闵可夫斯基距离通过调整参数适应不同场景,雅卡尔指数和Sørensen-Dice系数用于集合相似度。每种算法有其优缺点,如欧氏距离对异常值敏感,余弦相似度忽略数值大小,汉明距离仅适用于等长数据。
574 2
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
|
分布式计算 Hadoop 大数据
Hbase一:Hbase介绍及特点
Hbase一:Hbase介绍及特点
264 0
|
数据采集 机器学习/深度学习 存储
性能调优指南:针对 DataLoader 的高级配置与优化
【8月更文第29天】在深度学习项目中,数据加载和预处理通常是瓶颈之一,特别是在处理大规模数据集时。PyTorch 的 `DataLoader` 提供了丰富的功能来加速这一过程,但默认设置往往不能满足所有场景下的最优性能。本文将介绍如何对 `DataLoader` 进行高级配置和优化,以提高数据加载速度,从而加快整体训练流程。
2263 0
|
JavaScript
|
存储 缓存 算法
基于FPGA的二维DCT变换和逆变换verilog实现,包含testbench
基于FPGA的二维DCT变换和逆变换verilog实现,包含testbench
|
架构师 算法 Dubbo
划重点!2023面试必刷461道大厂架构面试真题汇总+面经+简历模板
在过去的一年里,LZ看到很多小伙伴在面试的时候都拿到了自己心仪的Offer,同时也在各大论坛博客平台看到了大家分享出来的面经,面试题。趁着年末时间多,公司上我手头的活基本完事了,就在业余时间把阿里,字节等大厂的Java岗面试真题为大家简单汇总了一下,一共是22个主流技术;除面试汇总外还有一份阿里七面面经与架构师简历模板,想要在金三银四面试的小伙伴可以好好看看,多少对你们有所帮助!
|
数据采集 消息中间件 JSON
数据预处理-系统监控-创建计算方法及监控实现思路|学习笔记
快速学习数据预处理-系统监控-创建计算方法及监控实现思路
242 0
数据预处理-系统监控-创建计算方法及监控实现思路|学习笔记
|
存储 运维 数据库
配置审计(Config)配合开启OSS防盗链功能
本文作者:紫极zj 本文将主要介绍利用【配置审计】功能,如何快速发现企业上云过程中,针对未配置防盗链的 OSS Bucket 定位及修复案例。
10325 0
配置审计(Config)配合开启OSS防盗链功能
|
SQL 数据库连接 数据库