1142 Maximal Clique (25point(s)) - C语言 PAT 甲级

1142 Maximal Clique (25point(s))

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

题目大意:

输入 N 个点,M 条边的一个无向图,K 次查询,每次查询给一个点集

  • 若所给点集中,若任意两个点都有边相连,称 Clique 点集
  • 若 Clique 点集不能再加入新的节点构成新的 Clique 点集,则称为 Maximal Clique

对于每次查询,判断点集是 Maximal,还是 Clique,或者不是 Clique

设计思路:

对于每次所给的点集

  • 在点集中的点,循环判断是否两两相连
    • 若是,则为 Clique,
      • 遍历不在点集中的点,看是否有点和 Clique 中的点均相连
        • 若没有,则为 Maximal
        • 若有,则可以确定仅仅是 Clique
    • 否则,Not a Clique
编译器:C (gcc)
include <stdio.h>

int main(void)
{
        int v[210][210];
        int nv, ne, m;
        int a, b, i, j;

        scanf("%d%d", &nv, &ne);
        for (i = 0; i < ne; i++) {
                scanf("%d%d", &a, &b);
                v[a][b] = 1;
                v[b][a] = 1;
        }
        int k, p[210], map[210] = {0};
        int clique, maximal;
        scanf("%d", &m);
        while (m--) {
                for (i = 0; i < 210; i++)
                        map[i] = 0;
                scanf("%d", &k);
                for (i = 0; i < k; i++) {
                        scanf("%d", &p[i]);
                        map[p[i]] = 1;
                }

                clique = 1;
                maximal = 1;
                for (i = 0; i < k; i++) {
                        if (clique == 0)
                                break;
                        for (j = i + 1; j < k; j++) {
                                if (v[p[i]][p[j]] == 0) {
                                        clique = 0;
                                        break;
                                }
                        }
                }
                if (clique) {
                        for (i = 1; i <= nv; i++) {
                                if (maximal == 0)
                                        break;
                                if (map[i] == 0) {
                                        for (j = 0; j < k; j++)
                                                if (v[p[j]][i] == 0)
                                                        break;
                                        if (j == k)
                                                maximal = 0;
                                }
                        }
                }

                if (clique == 0)
                        printf("Not a Clique\n");
                else if (maximal == 0)
                        printf("Not Maximal\n");
                else
                        printf("Yes\n");
        }
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值