1142 Maximal Clique (25 分)*

跟着柳婼学姐学习的笔记ヾ(≧▽≦*)o


原题目: 1142 Maximal Clique (25 分).

题意

clique是一个点集,在一个无向图中,这个点集中的任意两个不同点之间都是相连的。maximal clique是一个clique,这个clique再加入一个新的结点就不是clique了。
分别给出顶点和无向边数Nv和Ne,以及每条边所连两个顶点的序号(1-Nv),
👉判断所给顶点是否构成maximal clique或者clique。

分析

  1. 先判断是否是clique——判断任意两顶点是否都相连。
  2. 再判断是否是maximal clique——遍历所有不在集合中的剩余的点,看是否满足存在一个点满足和集合中所有点相连。
  3. 因此,用 邻接矩阵存储存储无向图,方便查看任意两顶点间是否相连。

【注】邻接矩阵只适用于顶点数目不太大(一般不超过1000)的题目。

CODE

#include <iostream>
#include <vector>
using namespace std;
int e[210][210];
int main()
{
    int nv, ne, m, ta, tb, k;
    cin >> nv >> ne;
    for ( int i=0; i<ne; i++ ){
        cin >> ta >> tb;
        e[ta][tb] = e[tb][ta] = 1; //用邻接矩阵存储无向图
    }
    cin >> m;
    for ( int i=0; i<m; i++ ){
        cin >> k;
        vector<int> v(k);
        int hash[210] = {0};
        int isclique = 1, isMaximal = 1;
        for ( int j=0; j<k; j++ ){
            cin >> v[j];  //待测序列顶点
            hash[v[j]] = 1;  //对应顶点标记
        }
        //判断是否clique,即是否任意两边都相连
        for ( int j=0; j<k; j++ ){
            if ( isclique==0 ) break;
            for ( int l=j+1; l<k; l++ ){
                if ( e[v[j]][v[l]]==0 ){
                    isclique = 0;
                    printf("Not a Clique\n");
                    break;
                }
            }
        }
        //在是clique的条件下,才接着判断是否是maximal
        if ( isclique==0 ) continue;
        for ( int j=1; j<=nv; j++ ){
            if ( hash[j]==0 ){  //不在待测序列中的顶点
                for ( int l=0; l<k; l++){
                    if (e[v[l]][j]==0 ) break;  //多一个点就不是clique,符合√
                    if ( l==k-1 ) isMaximal = 0;  //满足与所有顶点相连则不是maximal
                }
            }
            if ( isMaximal==0 ){
                printf("Not Maximal\n");
                break;
            }
        }
        if ( isMaximal ) printf("Yes\n");
    }
    
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值