1142 Maximal Clique
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
总结:唉,已经看懂了题目,怎么就是不能用代码好好表达我的意思呢!!!
继续加油,前路漫漫亦灿灿,加油,在不久的将来会看到光明的!
代码:(耗时长了很多,使用 hash 来存储当前数是否是题目给出的)
- #include
- #include
- #include
- using namespace std;
-
- vector
- int main(){
- int nv,ne,m,k;
- scanf("%d%d",&nv,&ne);
-
- for(int i=0;i
- int a,b;
- scanf("%d%d",&a,&b);
- v[a][b]=true;
- v[b][a]=true;
- }
-
- scanf("%d",&m);
- for(int i=0;i
- scanf("%d",&k);
- int a[k];
- map<int,bool> m;
- for(int i=0;i
- scanf("%d",&a[i]);
- m[a[i]]=true;
- }
- bool sign=true;
- for(int i=0;i
- bool flag=true;
- for(int j=i+1;j
- if(!v[a[i]][a[j]]){//确定不是Clique
- flag=false;
- break;
- }
- }
- if(!flag){
- sign=false;
- break;
- }
- }
- if(!sign) puts("Not a Clique");
- else{
- bool s=true;
- for(int i=1;i<=nv;i++){
- if(!m[i]){//如果这个点不是给出的点
- for(int j=0;j
- if(!v[i][a[j]]) break;//i表示当前循环到的点,j表示题目中给出的点
- if(j==k-1) s=false;
- }
- }
- if(!s){
- puts("Not Maximal");
- break;
- }
- }
- if(s) puts("Yes");
- }
- }
- return 0;
- }
柳神代码:
- #include
- #include
- using namespace std;
- int e[210][210];
- int main() {
- int nv, ne, m, ta, tb, k;
- scanf("%d %d", &nv, &ne);
- for (int i = 0; i < ne; i++) {
- scanf("%d %d", &ta, &tb);
- e[ta][tb] = e[tb][ta] = 1;
- }
- scanf("%d", &m);
- for (int i = 0; i < m; i++) {
- scanf("%d", &k);
- vector<int> v(k);
- int hash[210] = {0}, isclique = 1, isMaximal = 1;
- for (int j = 0; j < k; j++) {
- scanf("%d", &v[j]);
- hash[v[j]] = 1;
- }
- for (int j = 0; j < k; j++) {
- if (isclique == 0) break;
- for (int l = j + 1; l < k; l++) {
- if (e[v[j]][v[l]] == 0) {
- isclique = 0;
- printf("Not a Clique\n");
- break;
- }
- }
- }
- if (isclique == 0) continue;
- for (int j = 1; j <= nv; j++) {//遍历所有的点
- if (hash[j] == 0) {//如果不是给出的点
- for (int l = 0; l < k; l++) {//遍历已给出的点,看是当前点在给出点中是否相邻
- if (e[v[l]][j] == 0) break;
- if (l == k - 1) isMaximal = 0;//如果说存在一个点是全部给出点的相邻点,那么说明不是Maximal
- }
- }
- if (isMaximal == 0) {
- printf("Not Maximal\n");
- break;
- }
- }
- if (isMaximal == 1) printf("Yes\n");
- }
- return 0;
- }
好好学习,天天向上!
我要考研!
-
相关阅读:
解决Mysql8.0不存在mysql.proc表
RocketMQ之NameServer源码分析
HTML整站规划与规范
springboot vue elementui理发店预约系统源码
C++ 修饰符类型
leetcode 205. 同构字符串
Java中的类和对象(Java系列4)
Linux系统编程学习 NO.9——git、gdb
VC6 WIN32,Dialog为主窗口编程
Pytorch模型训练实用教程学习笔记:一、数据加载和transforms方法总结
-
原文地址:https://blog.csdn.net/weixin_50679551/article/details/127619833