1142. Maximal Clique (25)
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 way[300][300]={0};
int a[10000];
int judge(int x,int k)
{
int flagC = 0;
if (x != -1) a[k++] = x;
for (int i=0;i<k;i++)
if (!flagC)
for (int j=i+1;j<k;j++)
if (!way[a[i]][a[j]])
{
flagC = 1;
break;
}
return flagC;
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for (int i=0;i<m;i++)
{
int x,y;scanf("%d%d",&x,&y);
way[x][y] = way[y][x] = 1;
}
int pp;scanf("%d",&pp);
while (pp--)
{
int k;scanf("%d",&k);
for (int i=0;i<k;i++) scanf("%d",&a[i]);
if (judge(-1,k))
{
puts("Not a Clique");
continue;
}
for (int i=1;i<=n;i++)
{
int flag = 0;
for (int j=0;j<k;j++)
if (way[a[j]][i])
{
flag = 1;break;
}
if (flag)
{
if (!judge(i,k))
{
puts("Not Maximal");
goto out;
}
}
}
puts("Yes");
out:;
}
return 0;
}