1142 Maximal Clique

大致题意就是给出一个图,然后给出一些顶点,判断这些顶点之间是否两两相互连接,如果不是,那么这些顶点不能组成一个圈子clique,否则,如果继续加入其它顶点仍然使得顶点之间两两相互连接,那么这些顶点不是最大的圈子,否则,是最大的圈子。

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 int n,e,G[220][220] = {0};
 6 bool isClique(vector<int> v) {  
 7     bool flag = true;
 8     for(int i = 0; i < v.size() && flag; ++i) {
 9         for(int j = 0; j < v.size() && flag; ++j) {
10             if(i != j)
11                 if(G[v[i]][v[j]] != 1) flag = false;
12         }
13     }
14     return flag;
15 }
16 
17 int main() {
18     cin>>n>>e;
19     int u,v;
20     for(int i = 0; i < e; ++i) {
21         cin>>u>>v;
22         G[u][v] = G[v][u] = 1;
23     }
24     int m,k,t;
25     cin>>m;
26     for(int i = 0; i < m; ++i) {
27         cin>>k;
28         vector<int> vi(k);
29         bool hashtable[220] = {false};//标记顶点是否加入 vi集合 
30         for(int j = 0; j < k; ++j) {
31             cin>>vi[j];
32             hashtable[vi[j]] = true;
33         }
34         if(isClique(vi) == true) {
35             int flag = true;
36             for(int k = 1; k <= n && flag; ++k) {
37                 if(hashtable[k] == false) {
38                     vi.push_back(k);//加入未访问的顶点
39                     if(isClique(vi) == true) flag = false;//小圈子可以扩大 
40                     vi.pop_back();
41                 }
42             }
43             if(flag) printf("Yes\n");
44             else printf("Not Maximal\n");
45         } else printf("Not a Clique\n");
46     }
47     return 0 ;
48 }

 

posted @ 2020-03-14 19:42  tangq123  阅读(143)  评论(0编辑  收藏  举报