1142 Maximal Clique
Posted kkmjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1142 Maximal Clique相关的知识,希望对你有一定的参考价值。
题意:给出一个图,定义这样一个结点子集subset,若subset中的任意两结点不都相邻,则称之为Not a Clique;若subset中的任意两结点都相邻,则称之为Clique;若subset中的结点不仅都相邻,而且不存在subset之外的点与subset中的每个结点都相邻,则称之为Maximal。
思路:首先,判断待查询的结点是否都相邻;其次,判断是不是Maximal。怎么判断呢?遍历所有subset之外的结点(可以用vis[]数组来表示,标记subset[]里的结点为true,这样就只会访问非subset的点了),只要存在这样一个结点v,使得v与subset中的每个结点都相邻,则说明subset不是Maximal。
代码:
#include <cstdio> #include <cstring> const int maxn=205; int graph[maxn][maxn]={0}; int subset[maxn];//存放每次检查的结点 int vis[maxn];//标记在集合中出现过的结点 int n,m; int main() { scanf("%d%d",&n,&m); int u,v; while(m--){ scanf("%d%d",&u,&v); graph[u][v]=graph[v][u]=1; } int query,k; scanf("%d",&query); while(query--){ scanf("%d",&k); memset(vis,0,sizeof(vis));//每次查询前记得初始化 for(int i=0;i<k;i++){ scanf("%d",&subset[i]); vis[subset[i]]=1; } int flag=1;//1->Yes; 0->Not Maximal; -1->Not a Clique //1.检验是不是Clique for(int i=0;i<k;i++){ if(flag==-1) break; for(int j=i+1;j<k;j++){ if(graph[subset[i]][subset[j]]==0) { flag=-1; break; } } } if(flag==-1){ printf("Not a Clique "); continue; } //2.检验是不是Maximal for(int v=1;v<=n;v++){ if(vis[v]) continue; vis[v]=1; int i=0; for(;i<k;i++) if(graph[v][subset[i]]==0) break; if(i==k){ flag=0;//但凡存在一个不是subset中的结点使得该结点与subset中的每个结点都相连,说明它不是Maximal break; } }//for if(flag==1) printf("Yes "); else printf("Not Maximal "); } return 0; }
以上是关于1142 Maximal Clique的主要内容,如果未能解决你的问题,请参考以下文章