PAT 甲级 1166 Summit

题意

有n个人,其编号为1~n,有m个关系,该m个关系表示二者互为好友,接下来有k个区域,每个区域都有num个人,需要你判断这num个人是否都互为好友

  • 情况一,若这num个人并不是互为好友,则输出 Area x needs help.(x表示第x个区域)

若这num个人都相互是好友,

  • 情况二,是否存在某人,是该区域内所有人的好友,但未出现在区域中,若有,则输出Area x may invite more people, such as L.(x表示第x个区域,L表示某人的编号)
  • 情况三,不存在某人,则输出Area x is OK.

题解

  1. 题目一定要理解清楚,不懂就多读几遍,好的理解才有好的解题
  2. 情况二一定要理解清楚
#include <bits/stdc++.h>
using namespace std;

int mp[222][222];
int main(){
    
    
    int n, m; cin >> n >> m;
    for(int i = 0; i < m; i++){
    
    
        int a, b; cin >> a >> b;
        mp[a][b] = mp[b][a] = 1;//
    }
    
    int t; cin >> t;
    for(int T = 1; T <= t; T++){
    
    
        int num; cin >> num;
        vector<int> in(num);
        for(int i = 0; i < num; i++) {
    
    
            cin >> in[i];
        }
        int flag = 1;
        //先判断是不是所有人都相互是好朋友
        for(int i = 0; i < num; i++){
    
    
            for(int j = i + 1; j < num; j++){
    
    
                int tmp1 = in[i], tmp2 = in[j];
                if (mp[tmp1][tmp2] != 1){
    
    
                    flag = 3;
                }
            }
            if (flag == 3) {
    
    
                break;
            }
        }
        
        if (flag == 3) {
    
    
            printf("Area %d needs help.\n", T);
            continue;
        }
        else {
    
    
            int mininum = -1;
            //要是他们所有人的好朋友且没有被邀请的
            
            for(int i = 1; i <= n; i++){
    
    
                bool allfriend = true;
                for(int j = 0; j < num; j++){
    
    
                    if (mp[i][in[j]] == 0){
    
    
                        allfriend = false;
                        break;
                    }
                }
                if (allfriend == true){
    
    
                    //确保i没有出现过
                    bool takeplace = false;
                    for(int j = 0; j < num; j++){
    
    
                        if (in[j] == i) {
    
    
                            takeplace = true;
                            break;
                        }
                    }
                    if (takeplace == false){
    
    
                        mininum = i;
                        break;
                    }
                }
            }

            if (mininum == -1){
    
    
                printf("Area %d is OK.\n", T);
                continue;
            }
            else {
    
    
                printf("Area %d may invite more people, such as %d.\n", T, mininum);
                continue;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43382350/article/details/129305523
今日推荐