算法 每日一题——2022、6、22

题目:峰会

峰会是国家元首或政府首脑的会议。

为峰会安排休息区可不是一件简单的工作。

一共有 NN 个首脑参加峰会,编号 1∼N1∼N。

这些首脑之间存在 MM 对两两之间的直接朋友关系。

在划分区域时,我们希望被安排在同一休息区域的首脑们满足,任意两人之间都是直接朋友关系。

现在,给定 KK 个关于划分休息区域的安排,请你依次判断每个安排是否合理。

输入格式

第一行包含两个整数 NN 和 MM。

接下来 MM 行,每行包含两个整数 a,ba,b,表示首脑 aa 和首脑 bb 之间存在直接朋友关系。

再一行包含整数 KK。

接下来 KK 行,每行描述一个区域安排,首先包含一个整数 LL,表示该安排打算将 LL 个首脑安排在同一区域休息,然后包含 LL 个整数,表示这些首脑的编号。

输出格式

共 KK 行,第 ii 行输出对第 ii 个安排的判断,具体格式为

  • 如果安排满足其中的任意两人之间都是直接朋友关系并且不存在额外的人与被安排的所有人都是直接朋友关系(即无法安排更多的人在这一区域休息),则输出 Area X is OK.
  • 如果安排满足其中的任意两人之间都是直接朋友关系并且存在额外的人与被安排的所有人都是直接朋友关系(即可以安排更多的人在这一区域休息),则输出 Area X may invite more people, such as H.,其中 H 是额外可被安排的人的编号(如果不唯一,则输出最小的那个)。
  • 如果安排无法满足其中的任意两人之间都是直接朋友关系,则输出 Area X needs help.

X 表示组别编号,从 11 到 KK。

数据范围

1≤N≤2001≤N≤200,
1≤M≤N(N−1)21≤M≤N(N−1)2,
1≤a,b≤N1≤a,b≤N,
a≠ba≠b,
1≤K≤1001≤K≤100,
1≤L≤N1≤L≤N,
同一对直接朋友关系不会在输入中重复出现。

输入样例:

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
2 4 6
3 3 2 1

输出样例:

Area 1 is OK.
Area 2 is OK.
Area 3 is OK.
Area 4 is OK.
Area 5 may invite more people, such as 3.
Area 6 needs help.

解题:

①输入的关系先用一个关系矩阵进行存储

②检索每一个休息区,使用双层循环查看休息区内各首脑关系是否满足,发现不满足直接打印结果,continue,检索下一休息区

③休息区判断满足后寻找新的“潜在对象”

for循环控制遍历所有首脑和该休息区的首脑的关系来判断(:关系矩阵中自己和自己的关系设置为false,所以该过程不会将已在休息区的首脑加入进来

代码:

#include <iostream>

using namespace std;

const int N = 210;

bool relation[N][N];//首脑关系矩阵
int n,m,k;//输入值
int relax[N];//休息区
int main() {
    cin>> n >> m;
    while (m--){
        int i,j;
        cin>> i >> j;
        relation[i][j] = relation[j][i] = true;
    }
    int i = 0;
    cin  >> k ;
    while(k--){

        i++;
        int count;
        cin>> count;
        for (int i = 0; i < count; ++i) {
            cin>> relax[i];
        }
        bool flag = true;
        for (int j = 0; j < count-1; j++){
            for(int k = j +1; k < count; k++){
                if(!relation[relax[j]][relax[k]]){
                    flag = false;
                }
            }
        }
        if(!flag){
            cout<<"Area " << i << " needs help.\n";
            continue;
        }

        flag = false;
        int x;
        for (int i = 0; i < N; i++){
            bool tag = true;
            for (int j = 0; j < count; j++){
                if(!relation[i][relax[j]]){
                    tag = false;
                    break;
                }
            }
            if (tag){
                flag = true;
                x = i;
                break;
            }
        }
        if(flag){
            cout<< "Area " << i << " may invite more people, such as "<< x <<".\n";
        } else{
            cout<< "Area " << i << " is OK.\n";
        }

    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值