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 }