题目


解法1

点击查看代码
#include <iostream>
#include <unordered_map>
#include <unordered_set>
using namespace std;

int main() {
    int n, m; scanf("%d %d", &n, &m);

    // 使用 unordered_map 存储不兼容商品,每个商品 ID 都对应一个集合,存储所有与之不兼容的商品
    unordered_map<string, unordered_set<string>> incompatible;

    while (n--) { // 读取不兼容的商品对
        string a, b; cin >> a >> b;
        incompatible[a].insert(b);
        incompatible[b].insert(a); // 双向存储
    }

    while (m--) { // 处理每个待打包的物品列表
        int num; scanf("%d", &num);
        unordered_set<string> items;
        bool hasConflict = false;

        // 读取商品 ID
        while (num--) {
            string id; cin >> id;

            // 检查当前商品的不兼容商品是否在 items 中
            if (incompatible.find(id) != incompatible.end()) { // 如果id有不兼容的商品
                for (const string& conflictId : incompatible[id]) {// 取出所有与id不兼容的商品
                    if (items.find(conflictId) != items.end()) {// 如果不兼容的商品出现过
                        hasConflict = true;
                        break;
                    }
                }
            }
            items.insert(id); // 记录已出现的商品
        }
        
        printf(hasConflict ? "No\n" : "Yes\n");
    }

    return 0;
}