艰难的英语单词:clique 英 [kli:k] 派系;n.
题意:一张无向图,如果几个点之间,任意两个点都可达,叫做一个“块”。给一个图然后好几个序列,请判断它们是不是“块”、或是不“最大的块”(领接任意点都没法再加到块中成为更大的块)
难点:1、如何判断是不是块,很简单,各个点枚举一遍就好了
2、如何判断这个“块”是不是最大的“块”,可咋办呢?想了半天想不出一个高效的办法,后来网上一瞅。。。哦,暴力枚举一下饿。。。因为N小于200.
PS:考场没有Codeblocks,现在开始使用VS6.0,感觉是非常的奇妙啊。
ode:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
#define inf 209
int n,m,q;
int e[inf][inf];
vector<int>v;
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)//输入图
{
int a,b;
scanf("%d%d",&a,&b);
e[a][b]=e[b][a]=1;
}
scanf("%d",&q);
for(i=0;i<q;i++)
{
int num;
scanf("%d",&num);
v.clear();
for(j=0;j<num;j++)//输入clique
{
int t;
scanf("%d",&t);
v.push_back(t);
}
int flag=1;
//开始判断
for(j=0;j<num;j++)
for(k=j+1;k<num;k++)
if(!e[v[j]][v[k]])
{
flag=0;break;
}
if(!flag)//输出不是
{
printf("Not a Clique\n");
continue;
}
for(j=1;j<=n;j++)
{
int sum=0;
for(k=0;k<num;k++)
if(v[k]==j)break;
else if(e[j][v[k]])sum++;
if(sum==num)
{
flag=0;
break;
}
}
if(flag)printf("Yes\n");
else printf("Not Maximal\n");
}
return 0;
}