PAT 甲级 1166 Summit

程序用于分析n个人的好友关系,并检查给定的区域中的人是否都互为好友。如果区域内的人不都是好友,则输出需要帮助的信息。如果所有人都是好友,程序会查找是否存在未在区域内但与所有人皆为好友的人,并给出邀请建议。否则,确认区域状态为正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

有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;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值