PAT 甲级 1142 Maximal Clique (25 分)

思路:

1.用map的映射关系存储邻接矩阵;
2.先遍历所有给的点,比较是否邻接,以此判断是不是团;
3.若是团,则遍历所有团中结点,若结点的相邻节点数不等于k-1,则删去团中k-1个结点,将剩下的结点与团中结点比较,比较是否都相邻;

代码:

#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
int main(){
	int nv,ne,m;
	scanf("%d%d",&nv,&ne);
	vector<unordered_set<int>> mat(nv+1);
	for(int i=0;i<ne;i++){
		int v1,v2;
		scanf("%d%d",&v1,&v2);
		mat[v1].insert(v2);
		mat[v2].insert(v1);
	}
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		int n,j,k;
		scanf("%d",&n);
		vector<int> v(n);
		for(j=0;j<n;j++)
			scanf("%d",&v[j]);
		for(j=0;j<n-1;j++){
			for(k=j+1;k<n;k++)
				if(mat[v[j]].find(v[k])==mat[v[j]].end())
					break;
			if(k!=n) break;
		}
		if(j!=n-1){
			printf("Not a Clique
");
			continue;
		}
		vector<unordered_set<int>> mat1(mat);
		for(auto e:v){
			if(mat1[e].size()!=n-1){
				for(j=0;j<n;j++)
					if(v[j]!=e) mat1[e].erase(v[j]);
				for(auto p:mat1[e]){
					for(j=0;j<n;j++)
						if(mat[p].find(v[j])==mat[p].end())
							break;
					if(j==n) break;
				}
				if(j==n) break;	
			}
		}
		j==n?printf("Not Maximal
"):printf("Yes
");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12309088.html