1142. Maximal Clique (25)
A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one more adjacent vertex. (Quoted from https://en.wikipedia.org/wiki/Clique_(graph_theory))
Now it is your job to judge if a given subset of vertices can form a maximal clique.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers Nv (<= 200), the number of vertices in the graph, and Ne, the number of undirected edges. Then Ne lines follow, each gives a pair of vertices of an edge. The vertices are numbered from 1 to Nv.
After the graph, there is another positive integer M (<= 100). Then M lines of query follow, each first gives a positive number K (<= Nv), then followed by a sequence of K distinct vertices. All the numbers in a line are separated by a space.
Output Specification:
For each of the M queries, print in a line "Yes" if the given subset of vertices can form a maximal clique; or if it is a clique but not a maximal clique, print "Not Maximal"; or if it is not a clique at all, print "Not a Clique".
Sample Input:8 10 5 6 7 8 6 4 3 6 4 5 2 3 8 2 2 7 5 3 3 4 6 4 5 4 3 6 3 2 8 7 2 2 3 1 1 3 4 3 6 3 3 2 1Sample Output:
Yes Yes Yes Yes Not Maximal Not a Clique
#include<bits/stdc++.h>
using namespace std;
int n,m,nv,a,b,flag,k,len,cnt;
int mp[250][250];
int main(){
scanf("%d%d",&n,&nv);
for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)mp[i][j]=-1,mp[i][i]=1;
for(int i=0;i<nv;i++){
scanf("%d%d",&a,&b);
mp[a][b]=mp[b][a]=1;
}
scanf("%d",&m);
while(m--){
flag=1;
scanf("%d",&k);
vector<int>q;
q.resize(k+1);
for(int i=0;i<k;i++)scanf("%d",&q[i]);
///Not a Clique
for(int i=0;i<k;i++){
for(int j=0;j<k;j++){
a=q[i];b=q[j];
if(mp[a][b]!=1){flag=-1;break;}
}
if(flag==-1)break;
}
if(flag==-1){cout<<"Not a Clique"<<endl;continue;}
///Not Maximal
for(int i=1;i<=n;i++){
cnt=0;
for(int j=0;j<k;j++){
a=i;
b=q[j];
if(a!=b&&mp[a][b]==1)cnt++;
}
if(cnt==k){flag=-2;break;}
}
if(flag==-2){cout<<"Not Maximal"<<endl;continue;}
else cout<<"Yes"<<endl;
}
return 0;
}
本文介绍了一种算法,用于判断给定子图是否为原图中的最大完全图。该算法首先检查子图是否为完全图,然后判断是否可以扩展以形成更大的完全图。
4219

被折叠的 条评论
为什么被折叠?



