PAT A1142 Maximal Clique (25 分)
原题链接
- 大致题意
- 涉及知识点
- 思路
- AC代码
1.大致题意
给定一个节点序列,判断是否是clique和maximal clique
(1)clique:点集,在一个无向图中,这个点集中任意两个
不同的点之间都是相连的
(2)maximal clique:是一个clique,这个clique不可以再加入
任何一个新的结点构成新的clique
2.涉及知识点
(1)无向完全图:无向完全图是用n表示图中顶点数目的一种完全图,该图中每条边都是无方向的, 在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图
3.思路
先判断是否是clique,即判断是否任意两边都相连;之后判断是否是maximal,即遍历所有不在集合中的剩余的点,看是否存在⼀个点满⾜和集合中所有的结点相连,最后如果都满⾜,那就输出Yes表示是Maximal clique~
4.AC代码
#include<bits/stdc++.h>
using namespace std;
int a[300][300];//用邻接矩阵来存储图
int main(){
#ifdef ONLINE_JUDGE
#else
{
freopen("2.txt","r",stdin);
}
#endif
int n,m;//结点数,边
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x1,x2;
cin>>x1>>x2;
a[x1][x2]=1;//注意是无向图
a[x2][x1]=1;
}
int k;
cin>>k;//k个查询
for(int i=0;i<k;i++)
{
vector<int>v;
int t;
cin>>t;
int hash[300]={0};//用来判断当前没有出现的点
//输入当前待判定的集合
for(int j=0;j<t;j++)
{
int x3;
cin>>x3;
hash[x3]=1;
v.push_back(x3);
}
//先判断是否是clique
bool isclique=true;
//如果两点存在不相连的,就不是
for(int j=0;j<v.size();j++)
{
if(isclique==false) break;
for(int l=j+1;l<v.size();l++)
{
if(a[v[j]][v[l]]==0)
{
isclique=false;
break;
}
}
}
if(isclique==false) printf("Not a Clique\n");
else
{
bool ismaximal=true;
//判断是否是maximal
for(int z=1;z<=n;z++)
{
//找一个当前未出现的点
if(hash[z]==0)
{
for(int l=0;l<v.size();l++)
{
if(a[z][v[l]]==0)//无边,一个不相连不代表不能找到其他的
break;
if(l==v.size()-1) ismaximal=false;
/**能走到最后,没有跳出,说明中间
存在一个点,可以扩充原来的clique集合
说明原来的不是maximal clique
**/
}
}
}
//#########
ismaximal==false?cout<<"Not Maximal"<<endl:cout<<"Yes"<<endl;
}
}
return 0;
}
喵~