PAT(甲级)2019年冬季考试 7-3 Summit (25分)

今天做了套往年卷子,做的很慢,基本是一小时做一个题,这道题属于第三题,最后的最后我有了思路,但我不知道为什么pat考试时间一过就不允许再提交了,也无法检验我的思路是否正确。在自己的ide上跑了展示用例,是对上了。

对于这题我的思路是

1. 建立邻接矩阵图,按题输入将有联系的点直接距离设置为1

2.对每个长度为L的序列v1,遍历,从1-N中找哪些值和序列v1中的几个元素都连接,如果连接则加入另一个vector v。

3.观察结构序列v,如果是空的就是第三种情况,这几个首脑都互不认识需要帮助。如果非空,且v和v1相等,就表明这个朋友圈里的首脑都来齐了,第一种情况。如果v>v1,自然就是第二种情况,这几个首脑认识,但还有认识的人没进圈。

 

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using  namespace  std;

vector<int> head[210];
int G[210][210];
int n,m;
int main(){
    cin>>n>>m;
    int t1,t2;
    fill(G[0],G[0]+210*210,0);
    for(int i=0;i<m;i++){
        cin>>t1>>t2;
        G[t1][t2]=1;
        G[t2][t1]=1;
        head[t1].push_back(t2);
        head[t2].push_back(t1);
    }
    int k;
    cin>>k;
    int l,tmp,minnum;;
    for(int i=0;i<k;i++){
        cin>>l;
        vector<int> v1;
        for(int j=0;j<l;j++){
            cin>>tmp;
            v1.push_back(tmp);
        }
        vector<int> v;
        for(int j=1;j<=n;j++){
            int flag2=0;
            for(int u=0;u<l;u++){
                if(v1[u]!=j){
                    if(G[v1[u]][j]!=1||G[j][v1[u]]!=1){
                        flag2=1;
                        break;
                    }
                }
            }
            if(flag2==0)v.push_back(j);
        }
        if(v.empty())printf("Area %d needs help.",i+1);
        else{
            sort(v1.begin(),v1.end());
            if(v==v1){
                printf("Area %d is OK.\n",i+1);
            }
            else {
                for(int j=0;j<v.size();j++){
                    if(find(v1.begin(),v1.end(),v[j])==v1.end()){
                        minnum=v[j];
                        break;
                    }
                }
                printf("Area %d may invite more people, such as %d.\n",i+1,minnum);
            }
        }
    }
    return 0;
}

 

posted @ 2020-08-31 14:55  uy9ko  阅读(230)  评论(0)    收藏  举报