峰会是国家元首或政府首脑的会议。
为峰会安排休息区可不是一件简单的工作。
一共有 个首脑参加峰会,编号
。
这些首脑之间存在
在划分区域时,我们希望被安排在同一休息区域的首脑们满足,任意两人之间都是直接朋友关系。
现在,给定
输入格式
第一行包含两个整数 和
。
接下来 行,每行包含两个整数
,表示首脑
和首脑
再一行包含整数 。
接下来 行,每行描述一个区域安排,首先包含一个整数
,表示该安排打算将
个首脑安排在同一区域休息,然后包含
输出格式
共 行,第
行输出对第
- 如果安排满足其中的任意两人之间都是直接朋友关系并且不存在额外的人与被安排的所有人都是直接朋友关系(即无法安排更多的人在这一区域休息),则输出
Area X is OK.
- 如果安排满足其中的任意两人之间都是直接朋友关系并且存在额外的人与被安排的所有人都是直接朋友关系(即可以安排更多的人在这一区域休息),则输出
Area X may invite more people, such as H.
,其中H
是额外可被安排的人的编号(如果不唯一,则输出最小的那个)。 - 如果安排无法满足其中的任意两人之间都是直接朋友关系,则输出
Area X needs help.
。表示组别编号,从
到
。
数据范围
同一对直接朋友关系不会在输入中重复出现。
输入样例:
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.
#include<iostream>
#include<cstring>
using namespace std;
const int N = 210;
int n, m, k;
bool g[N][N], st[N];
int main(){
cin >> n >> m;
int a, b;
for(int i = 0; i < m; i++){
cin >> a >> b;
g[a][b] = g[b][a] = true;
}
cin >> k;
int q[N];
for(int t = 1; t <= k; t++){
memset(st, 0, sizeof st);
int l;
cin >> l;
for(int i = 0; i < l; i++)
cin >> q[i], st[q[i]] = true;
bool flag = true;
for(int i = 0; i < l; i++)
for(int j = 0; j < i; j++)
if(!g[q[i]][q[j]]){
flag = false;
break;
}
if(flag){
for(int i = 1; i <= n; i++)
if(!st[i]){
bool f1 = true;
for(int j = 0; j < l; j++)
if(!g[i][q[j]]){
f1 = false;
break;
}
if(f1){
flag = false;
printf("Area %d may invite more people, such as %d.\n", t, i);
break;
}
}
if(flag) printf("Area %d is OK.\n", t);
}
else printf("Area %d needs help.\n", t);
}
return 0;
}