pat 1166 Summit

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/1478635919459287040

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

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

一共有 N 个首脑参加峰会,编号 1N

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

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

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

输入格式

第一行包含两个整数 N 和 M。

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

再一行包含整数 K

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

输出格式

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

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

X 表示组别编号,从 1 到 K

思路:上来感觉很想并查集,并且尝试写了一下,但不是,还是笨了

这个题用无向图模拟就可以解决,因为数据很小,模拟完全可以

用一个集合set来表示当前这个人被安排在了区域中,g[i][j]表示两人是否存在朋友关系;

模拟处理,如果说当前i,j都被安排了并且不存在朋友关系就是三

用cnt来表示在此区域中除了被安排的人以外还存在其他没有被安排的人与安排的人是朋友关系就是情况二

其余就是正常情况

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=210;
 4 int g[N][N];
 5 set<int>s;
 6 int n,m,k;
 7 int main()
 8 {
 9     cin>>n>>m;
10     while(m--)
11     {
12         int a,b;
13         cin>>a>>b;
14         g[a][b]=g[b][a]=1;
15     }
16     cin>>k;
17     for(int p=1;p<=k;p++)
18     {
19         s.clear();
20         bool flag1=true;
21         int l;
22         cin>>l;
23         while(l--)
24         {
25             int tmp;
26             cin>>tmp;
27             s.insert(tmp);
28         }
29         for(int i=1;i<=n;i++)
30         {
31             for(int j=i+1;j<=n;j++)
32             {
33                 if(s.count(i)&&s.count(j)&&!g[i][j])
34                 {
35                     flag1=false;
36                     break;
37                 }
38             }
39         }
40         if(!flag1)
41         printf("Area %lld needs help.\n",p);
42         else
43         {
44             int cnt=0;
45             for(int i=1;i<=n;i++)
46             {
47                 if(!s.count(i))
48                 {
49                     bool flag2=true;
50                     for(int j=1;j<=n;j++)
51                     {
52                         if(s.count(j)&&!g[i][j])
53                         {
54                             flag2=false;
55                             break;
56                         }
57                     }
58                     if(flag2)
59                     {
60                         cnt=i;
61                         break;
62                     }
63 
64                 }
65             }
66             if(cnt)
67             printf("Area %lld may invite more people, such as %lld.\n",p,cnt);
68             else
69             printf("Area %lld is OK.\n",p);
70         }
71     }
72     return 0;
73 }

 

posted @ 2022-09-16 20:29  江上舟摇  阅读(31)  评论(0编辑  收藏  举报