首页 > 其他 > 详细

PAT_A1142#Maximal Clique

时间:2019-05-23 23:19:13      阅读:196      评论:0      收藏:0      [点我收藏+]

Source:

PAT A1142 Maximal Clique (25 分)

Description:

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 1

Sample Output:

Yes
Yes
Yes
Yes
Not Maximal
Not a Clique

Keys:

Attention:

  • 想的有点多,数据规模不大,暴力求解就好了

Code:

 1 /*
 2 Data: 2019-05-23 20:57:23
 3 Problem: PAT_A1142#Maximal Clique
 4 AC: 49:30
 5 
 6 题目大意:
 7 判断所给子图是否是完全图
 8 输入:
 9 第一行给出,顶点数Nv<=200,Ne边数
10 接下来Ne行,给出边的头尾结点
11 接下来一行,给出查询数M;
12 接下来M行,给出顶点数K,和K个顶点;
13 */
14 
15 #include<cstdio>
16 #include<algorithm>
17 const int M=210;
18 int grap[M][M],vis[M];
19 
20 int main()
21 {
22 #ifdef    ONLINE_JUDGE
23 #else
24     freopen("Test.txt", "r", stdin);
25 #endif
26 
27     int n,m,q,v1,v2,v[M];
28     scanf("%d%d", &n,&m);
29     std::fill(grap[0],grap[0]+M*M,0);
30     for(int i=0; i<m; i++)
31     {
32         scanf("%d%d", &v1,&v2);
33         grap[v1][v2]=1;
34         grap[v2][v1]=1;
35     }
36     scanf("%d", &m);
37     for(int i=0; i<m; i++)
38     {
39         scanf("%d", &q);
40         std::fill(vis,vis+n+1,0);
41         for(int j=0; j<q; j++)
42         {
43             scanf("%d", &v[j]);
44             vis[v[j]]=1;
45         }
46         for(int j=0; j<q; j++)
47         {
48             v1=v[j];
49             for(int k=0; k<q; k++)
50             {
51                 v2=v[k];
52                 if(k==j) continue;
53                 if(grap[v1][v2]==0)
54                 {
55                     vis[0]=1;break;
56                 }
57             }
58             if(vis[0]==1)  break;
59         }
60         if(vis[0]==1)
61             printf("Not a Clique\n");
62         else
63         {
64             for(v1=1; v1<=n; v1++)
65             {
66                 if(vis[v1]==1) continue;
67                 vis[0]=0;
68                 for(int k=0; k<q; k++)
69                 {
70                     v2=v[k];
71                     if(grap[v1][v2]==1)
72                         vis[0]++;
73                 }
74                 if(vis[0]==q)
75                     break;
76             }
77             if(vis[0]==q)
78                 printf("Not Maximal\n");
79             else
80                 printf("Yes\n");
81         }
82     }
83 
84     return 0;
85 }

 

PAT_A1142#Maximal Clique

原文:https://www.cnblogs.com/blue-lin/p/10915194.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!