PAT——1142 Maximal Clique 甲级

题目

https://pintia.cn/problem-sets/994805342720868352/problems/994805343979159552

题意

题目中的Clique是一个点集合,里面的点在给定的图中两两相邻

而 Maximal Clique 就是指如果再向这个点集合中加入图中的其他任意点,无法满足两两相邻的条件,因此当前的点集合就是最大的

题目解析

将给定的边记录在图f中,通过两两比较判断待测序列的点是否符合Clique的条件

如果符合再遍历其它(不在待测序列中的)点,是否和待测序列中的所有点相连,如果存在一个这样的点,这个序列就不是Maximal Clique,否则是

AC代码

#include<bits/stdc++.h>
using namespace std;
int f[201][201],vis[201];
int nv,ne,m;
int main()
{
	scanf("%d %d",&nv,&ne);
	while(ne--)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		f[x][y]=f[y][x]=1;
	}
	cin>>m;
	while(m--)
	{
		int n,clique=1,maxn=1;
		cin>>n;
		int a[n];
		fill(vis,vis+201,0);
		for(int i=0;i<n;i++) 
		{
			scanf("%d",&a[i]);
			vis[a[i]]=1;
		}
		for(int i=0;i<n;i++)
			for(int j=i+1;j<n;j++)
				if(f[a[i]][a[j]]==0) clique=0;
		if(clique)
		for(int i=1;i<=nv;i++)
		{
			if(vis[i]==0)
			{
				int j;
				for(j=0;j<n;j++)
					if(f[i][a[j]]==0) break;
				if(j==n) 
				{
					maxn=0;
					break;	
				}
			}
		}
		if(clique&&maxn) printf("Yes\n");
		else if(clique&&!maxn) printf("Not Maximal\n");
		else printf("Not a Clique\n");
	}
}

参考

PAT 1142. Maximal Clique (25) - 甲级

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值