1090 危险品装箱 (25分)详解
数据:
6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006
本题分析
:
- 题目的关键在于如何解决编号不相容问题,由以上数据可知,20003与20004和20001都不相容.
此时我们可以用:
map<int,vector<int>>mp;//用于存放一对多的关系
2.难点分析
//此处循环是难点,第一个for循环是为了遍历G[i],
第二个是遍历每个G[i]所对应的vector数组,
如本题数据中20003(G[i])所对应的vector中有(20004和20001)两个值,然后用从c[]数组判断G[i]所对应的编号是否在此次 cin >> G[i];中存在,
若存在flag标记为1.
for(int i=0; i<k; i++){
for(int j=0; j<mp[G[i]].size(); j++){
if(c[mp[G[i]][j]]==1) flag=1;
}
}
代码
#include<bits/stdc++.h>
using namespace std;
map<int,vector<int>>mp;//用于存放一对多的关系
int main() {
int m,n;
cin >> m >> n;
while(m--){
int a,b;
cin >> a >> b;
mp[a].push_back(b);
mp[b].push_back(a);
}
while(n--){
int k;
cin >> k;
int G[k],c[100010]={0};//用于存放物品编号,注意每次循环初始化
for(int i=0; i<k; i++){
cin >> G[i];
c[G[i]]=1;//用于标记编号是否存在,存在则值为1,否则为零
}
int flag=0;
for(int i=0; i<k; i++){
for(int j=0; j<mp[G[i]].size(); j++){
if(c[mp[G[i]][j]]==1) flag=1;
}
}
if(flag==1){
cout << "No" <<endl;
}
else
cout << "Yes" <<endl;
}
return 0;
}
博客围绕1090危险品装箱题展开,给出相关数据,分析题目关键在于解决编号不相容问题,如20003与20004和20001不相容,还提及难点分析和代码,但未详细给出代码内容。

630

被折叠的 条评论
为什么被折叠?



