危险品装箱 (PATB-1090)
题面
集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。
本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。
输入
输入第一行给出两个正整数:N (≤104) 是成对的不相容物品的对数;M (≤100) 是集装箱货品清单的单数。
随后数据分两大块给出。第一块有 N 行,每行给出一对不相容的物品。第二块有 M 行,每行给出一箱货物的清单,格式如下:
1K G[1] G[2] ... G[K]
其中
K
(≤1000) 是物品件数,G[i]
是物品的编号。简单起见,每件物品用一个 5 位数的编号代表。两个数字之间用空格分隔。
输出
对每箱货物清单,判断是否可以安全运输。如果没有不相容物品,则在一行中输出
Yes
,否则输出No
。
样例输入
16 3
220001 20002
320003 20004
420005 20006
520003 20001
620005 20004
720004 20006
84 00001 20004 00002 20003
95 98823 20002 20003 20006 10010
103 12345 67890 23333
样例输出
1No
2Yes
3Yes
提示
无
思路
代码
1const int mxn = 1e5 + 5;
2
3int a[mxn];
4
5int main()
6{
7 int n, m;
8 scanf("%d %d", &n, &m);
9
10 map<int, vector<int> > mmp;
11
12 for (int i=0; i<n; i++)
13 {
14 int x, y;
15 scanf("%d%d", &x, &y);
16 mmp[x].push_back(y);
17 mmp[y].push_back(x);
18 }
19
20 while (m--)
21 {
22 memset(a, 0, sizeof a);
23 int k; scanf("%d", &k);
24
25 vector<int> v(k);
26 for (int i=0; i<k; i++)
27 {
28 scanf("%d", &v[i]);
29 a[v[i]] = 1;
30 }
31
32 int f = 0;
33 for (int i=0; i<v.size(); i++)
34 {
35 for (int j=0; j<mmp[v[i]].size(); j++)
36 {
37 if (a[mmp[v[i]][j]])
38 {
39 f = 1;
40 break;
41 }
42 }
43 if(f) break;
44 }
45 printf("%s\n", f ? "No" :"Yes");
46 }
47
48 return 0;
49}