zoukankan      html  css  js  c++  java
  • PAT (Advanced Level) Practice 1142 Maximal Clique (25分) (算法设计)

    1.题目

    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

    2.题目分析

     A maximal clique就是给的点在图中彼此互相都能联通,而且这些点中的任意一个与其它剩下的所有点不能全联通

    只满足第一点就是Not Maximal

    3.代码

    #include<iostream>
    #include<set>
    #include<string>
    #include<cstring>
    using namespace std;
    int nv, ne,m;
    int edges[201][201];
    int temp[202];
    int main()
    {
    	scanf("%d %d", &nv, &ne);
    	set<int>run;
    	for (int i = 1; i <= ne; i++)
    	{
    		int a, b;
    		scanf("%d %d", &a, &b);
    		edges[a][b] = 1;
    		edges[b][a] = 1;
    		run.insert(a);
    		run.insert(b);
    	}
    	scanf("%d", &m);
    	for (int i = 1; i <= m; i++)
    	{
    		int k;
    		bool max = false, noclique=false;
    		int maximal = 0;
    		set<int>temprun = run;//temprun中是图中除了所给节点剩下的节点
    		scanf("%d", &k);
    		fill(temp, temp + nv, 0);
    		for (int j = 1; j <= k; j++)
    		{
    			scanf("%d", &temp[j]);
    			temprun.erase(temp[j]);
    		}
    		for (int j = 1; j <=k; j++)
    		{
    			for (int s = 1; s <= k; s++)
    			{
    				if (j!=s&&edges[temp[j]][temp[s]] != 1) { noclique = true; break; }
    			}
    			if (noclique)break;
    		}
    		if (noclique){printf("Not a Clique
    "); continue;}
    		for (auto it = temprun.begin(); it != temprun.end(); it++)
    		{
    			maximal = 0;
    			for (int j = 1; j <= k; j++)
    			{
    				if (edges[*it][temp[j]] != 0) maximal++; 
    			}
    			if (maximal == k) { max = true; break; }
    		}
    		if (max) { printf("Not Maximal
    "); continue; }
    		printf("Yes
    ");
    	}
    }
    
  • 相关阅读:
    Python Challenge 第十二关
    Python Challenge 第十一关
    Python Challenge 第十关
    Python Challenge 第九关
    Python Challenge 第八关
    Python Challenge 第七关
    zepto
    zepto
    zepto
    zepto
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788881.html
Copyright © 2011-2022 走看看