Java
import java.io.*;
import java.util.*;
public class Main {
static final int N = 210;
static int n, m;
static boolean[][] g = new boolean[N][N];
static boolean[] tag = new boolean[N];
static int[] seq = new int[N];
static Set<Integer> set = new HashSet<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int head1 = Integer.parseInt(st.nextToken());
int head2 = Integer.parseInt(st.nextToken());
g[head1][head2] = g[head2][head1] = true;
tag[head1] = tag[head2] = true;
}
int k = Integer.parseInt(br.readLine());
for (int areaNum = 1; areaNum <= k; areaNum++) {
set.clear();
st = new StringTokenizer(br.readLine());
int groupSize = Integer.parseInt(st.nextToken());
for (int i = 0; i < groupSize; i++) {
seq[i] = Integer.parseInt(st.nextToken());
set.add(seq[i]);
}
boolean isComplete = true;
for (int i = 0; i < groupSize && isComplete; i++) {
for (int j = i + 1; j < groupSize; j++) {
if (!g[seq[i]][seq[j]]) {
isComplete = false;
break;
}
}
}
if (!isComplete) {
System.out.printf("Area %d needs help.%n", areaNum);
continue;
}
boolean canAddMore = false;
for (int i = 1; i <= n && !canAddMore; i++) {
if (tag[i] && !set.contains(i)) {
boolean canAdd = true;
for (int j = 0; j < groupSize; j++) {
if (!g[i][seq[j]]) {
canAdd = false;
break;
}
}
if (canAdd) {
System.out.printf("Area %d may invite more people, such as %d.%n", areaNum, i);
canAddMore = true;
}
}
}
if (!canAddMore) {
System.out.printf("Area %d is OK.%n", areaNum);
}
}
}
}
C++
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>
using namespace std;
const int N = 210;
int n, m;
bool g[N][N], tag[N]; // [1, n]
int seq[N];
unordered_set<int> st;
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; ++i) {
int a, b;
scanf("%d%d", &a, &b);
g[a][b] = g[b][a] = true;
tag[a] = tag[b] = true;
}
int Q;
scanf("%d", &Q);
for (int k = 1; k <= Q; ++k) {
st.clear();
int num;
scanf("%d", &num);
for (int i = 0; i < num; ++i) {
scanf("%d", &seq[i]);
st.insert(seq[i]);
}
bool flag = true;
for (int i = 0; i < num; ++i)
for (int j = i; j < num; ++j)
if (i != j && !g[seq[i]][seq[j]]) {
flag = false;
break;
}
if (!flag) {
printf("Area %d needs help.\n", k);
continue;
}
for (int i = 1; i <= n; ++i)
if (tag[i] && !st.count(i)) {
bool is_valid = true;
for (int j = 0; j < num; ++j)
if (!g[i][seq[j]]) {
is_valid = false;
break;
}
if (is_valid) {
printf("Area %d may invite more people, such as %d.\n", k, i);
flag = false;
break;
}
}
if (flag) printf("Area %d is OK.\n", k);
}
return 0;
}