题目链接
思路
①一种化学物质可与多种物质反应,所以用multimap的一对多关系
②对每一次判断,逐个输入化学物质,将可与该化学物质反应的所有物质存储在vector中,然后只需判断该下一个输入的物质在不在vector里就好,在的话,cin走一下形式,完活儿了
代码
using namespace std;
#include<bits/stdc++.h>
multimap<int, int>danger;
int N, M, p, q,judge,num;
vector<int>backup;
int main() {
cin >> N>>M;
for (int i = 0; i < N; i++) {
cin >> p >> q;
danger.insert(make_pair(p, q));
danger.insert(make_pair(q, p));
}
for (int i = 0; i < M; i++) {
bool flag = true;
cin >> num;
vector<int>().swap(backup);
for (int i = 0; i < num; i++) {
cin >> judge;
if (flag) {
if (find(backup.begin(), backup.end(), judge) != backup.end()) {
flag = false;
continue;
}
auto p = danger.equal_range(judge);
for (auto k= p.first; k != p.second; k++) {
backup.push_back(k->second);
}
}
}
if (flag)cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
unordered_map模拟multimap也许能快一些?
代码二
using namespace std;
#include <iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
unordered_map<int, vector<int>>danger;
int N, M, p, q, judge, num;
vector<int>backup;
int main() {
cin >> N >> M;
for (int i = 0; i < N; i++) {
cin >> p >> q;
danger[p].push_back(q);
danger[q].push_back(p);
}
for (int i = 0; i < M; i++) {
bool flag = true;
cin >> num;
vector<int>().swap(backup);
for (int i = 0; i < num; i++) {
cin >> judge;
if (flag) {
if (find(backup.begin(), backup.end(), judge) != backup.end()) {
flag = false;
continue;
}
for (auto k = danger[judge].begin(); k != danger[judge].end(); k++) {
backup.push_back(*k);
}
}
}
if (flag)cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}