分析
Area 1 is OK.——》任意一个点都与剩下点相连;且无剩余点与这些点都相连
Area 5 may invite more people, such as 3.——》任意一个点都与剩下点相连
且有剩余点;找到最小的剩余点
Area 6 needs help.——》存在1个点与剩下点不相连
代码
#include<bits/stdc++.h>
using namespace std;
int vertex, edge, times, number;
vector<vector<int>>graph;
void InPut(vector<bool>&);
void Judge(int, vector<bool>);
int main() {
vector<bool>visit;
InPut(visit);
for (int i = 1; i < times + 1; i++)
Judge(i, visit);
return 0;
}
void InPut(vector<bool>& visit) {
scanf("%d %d", &vertex, &edge);
graph.resize(vertex + 1);
visit.resize(vertex + 1);
for (int i = 0; i < vertex + 1; i++) {
graph[i].resize(vertex + 1);
fill(graph[i].begin(), graph[i].end(), 0);
visit[i] = true;
}
visit[0] = false;
int x, y;
for (int i = 0; i < edge; i++) {
scanf("%d %d", &x, &y);
graph[x][y] = 1;
graph[y][x] = 1;
}
scanf("%d", ×);
}
void Judge(int id, vector<bool>visit) {
scanf("%d", &number);
vector<int>judge;
bool not_friend{ false };
int x;
for (int i = 0; i < number; i++) {
scanf("%d", &x);
visit[x] = false;
judge.push_back(x);
if (!not_friend) {
for (int j = judge.size() - 1; j - 1 >= 0; j--) {
if (graph[judge[j]][judge[j - 1]] == 0) {
printf("Area %d needs help.\n", id);
not_friend = true;
}
}
}
}
if (not_friend)
return;
bool flag;
for (int i = 1; i < visit.size(); i++) {
flag = true;
if (visit[i]) {
for (int j = 0; j < judge.size(); j++) {
if (graph[i][judge[j]] == 0) {
flag = false;
}
}
if (flag) {
printf("Area %d may invite more people, such as %d.\n", id, i);
return;
}
}
}
printf("Area %d is OK.\n", id);
}