题意
有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.
题解
- 题目一定要理解清楚,不懂就多读几遍,好的理解才有好的解题
- 情况二一定要理解清楚
#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;
}
}
}
}