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.
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.
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
.
- 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 1
- Yes
- Yes
- Yes
- Yes
- Not Maximal
- Not a Clique
解题思路:模拟题,读懂题意最为重要
- clique : 在集合中,任意两个不同的点,在图中都有边相连
- maximal clique : 是clique , 如果该clique不能通过加入某个新的顶点来扩展成一个更大的Clique
根据这两条性质,很容易的判断是哪种情况,首先先看联通性,其次再看除了集合中的点是否还跟集合中的点有边。
- /*
- clique : 在集合中,任意两个不同的点,在图中都有边相连
- maximal clique : 是clique , 如果该clique不能通过加入某个新的顶点来扩展成一个更大的Clique
- */
- #include
- #include
- #include
- #include
-
- using namespace std;
- const int N = 210;
- int n , m;
- bool g[N][N] , st[N];
- vector<int>v;
-
- bool check1()
- {
- for(int i = 0;i < v.size();i ++)
- for(int j = 0;j < i;j ++)
- if(!g[v[i]][v[j]]) return false;
- return true;
- }
-
- bool check2()
- {
- memset(st , false , sizeof st);
- for(int i = 0;i < v.size();i ++) st[v[i]] = true;//标记所有clique中的点
-
- for(int i = 1;i <= n;i ++)
- {
- if(!st[i]) //不是clique的点
- {
- bool flag = true;
- for(int j = 0;j < v.size();j ++)
- {
- if(!g[i][v[j]])
- {
- flag = false;
- break;
- }
- }
- if(flag) return false;
- }
- }
- return true;
- }
-
- int main()
- {
- cin >> n >> m;
- while(m --)
- {
- int a , b;
- cin >> a >> b;
- g[a][b] = g[b][a] = true;
- }
-
- int k;
- cin >> k;
- while(k --)
- {
- int x;
- cin >> x;
- for(int i = 0;i < x;i ++)
- {
- int num;
- cin >> num;
- v.push_back(num);
- }
-
- //判断是否是clique
- if(check1())
- {
- if(check2()) puts("Yes");
- else puts("Not Maximal");
- }
- else puts("Not a Clique");
- v.clear();
- }
- return 0;
- }