当前位置: 代码迷 >> 综合 >> PAT-1142-Maximal Clique
  详细解决方案

PAT-1142-Maximal Clique

热度:61   发布时间:2023-11-18 06:15:54.0

1142

一遍ac

//
// Created by ZhangXiaoYu_TJUT on 2020/7/15.
////如果只有一个节点的话且该节点没有邻接节点,直接输出yes。遍历给的第一个节点的所有邻接节点,如果这个邻接节点也是其他所有人的邻接节点,说明不是max
//关于是不是clique:用邻接表表示就可以了,如果e[i][j]==1说明联通,这样遍历所有给出的节点,就可以了。
#include <iostream>
#include <vector>
#include <unordered_map>using namespace std;int nv,ne,m,k;
int e[210][210];
int main(){
    unordered_map<int,vector<int>>v; //用来存所有相邻顶点cin>>nv>>ne;int a,b;while(ne--){
    cin>>a>>b;e[a][b]=e[b][a]=1;v[a].push_back(b);v[b].push_back(a);}cin>>m;while(m--){
    int flag =2;cin>>k;int tmp;vector<int> ans;for(int i=0;i<k;i++){
    cin>>tmp;ans.push_back(tmp);}if(k==1 && v[ans[0]].size()==0){
     //如果只有一个数据而且这个数据没有邻接点cout<<"Yes"<<endl;continue;}int not_flag=0;//flag 为0 表示not,为1表示not max,为2表示yes。假设是yes,接着判断如果不连通则0,如果联通但不是最大为1,除此之外说明假设成立for(int i=0;i<ans.size();i++){
     //遍历所有点int tmp_flag=0;for(int j=i+1;j<ans.size();j++){
    //判断询问的点是否连通if(e[ans[i]][ans[j]]==0){
    not_flag=1;break;}}if(not_flag)break;}if(not_flag){
    cout<<"Not a Clique"<<endl;continue;}//接下来判断该clique是否是maximala=ans[0];int not_maximal = 0;for(int i=0;i<v[a].size();i++){
    int edge=1;for(int j=1;j<ans.size();j++){
    if(e[v[a][i]][ans[j]])edge++;else break;}if(edge==ans.size()){
    flag=1;break;}
// for(int j=0;j<v[i].size();j++){
    
// for(int l=0;l<ans.size()&& l!=i;l++){
    
// if()
// }
// }}if(flag==1)cout<<"Not Maximal"<<endl;else cout<<"Yes"<<endl;}
}