心得:
知道在循环遍历序列时是不要进行增加和删除操作的
而对于map,如果map原本没有key这个键,但是只要出现m[key],就会在map中添加一个新值,而在遍历map时,可能本意是通过索引查询,但是这样增加了一个值后,后面的遍历也好,下面的条件判断也好,都可能会出现问题
做本题时,我遍历了map,并在里面写了if(m[key]),结果创建了新值,出了错,即使我的本意是想索引查询;
所以在遍历map时,里面一定要不有m[key]的操作出现,非常危险
如果需要m[]索引查找,应该把查询的值存进另一个容器,然后遍历另一个容器在里面m[]索引查询
题目:
集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。
本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。
输入格式:
输入第一行给出两个正整数:N (≤104) 是成对的不相容物品的对数;M (≤100) 是集装箱货品清单的单数。
随后数据分两大块给出。第一块有 N 行,每行给出一对不相容的物品。第二块有 M 行,每行给出一箱货物的清单,格式如下:
K G[1] G[2] ... G[K]
其中 K
(≤1000) 是物品件数,G[i]
是物品的编号。简单起见,每件物品用一个 5 位数的编号代表。两个数字之间用空格分隔。
输出格式:
对每箱货物清单,判断是否可以安全运输。如果没有不相容物品,则在一行中输出 Yes
,否则输出 No
。
思路:
这一题和第六十五题思路一样
但是这个映射关系可能是一对多的,即一个物品会和多个物品形成危险关系,所以value应是一个vector容器
然后遍历某个清单,查看这个清单每个物品的"危险伙伴"是否也在其中,在的话就是危险的
代码:
#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;
int main()
{
int num,list_num;
scanf("%d %d",&num,&list_num);
unordered_map<int,vector<int>> m;
for(int i=0;i<num;i++)
{
int temp1,temp2;
scanf("%d %d",&temp1,&temp2);
m[temp1].push_back(temp2);
m[temp2].push_back(temp1);
}
for(int i=0;i<list_num;i++)
{
int goods_num;
bool danger=false;
unordered_map<int,bool> have;
scanf("%d",&goods_num);
vector<int> v;
for(int j=0;j<goods_num;j++)
{
int temp;
scanf("%d",&temp);
v.push_back(temp);
have[temp]=true;
}
for(int j=0;j<v.size();j++)
{
for(int k=0;k<m[v[j]].size();k++)
{
if(have[m[v[j]].at(k)])
{
danger=true;
break;
}
}
if(danger)
break;
}
if(danger)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}