天天看點

PAT_甲級_1149 Dangerous Goods Packaging (25point(s)) (C++)【STL應用】

目錄

​​1,題目描述​​

​​題目大意​​

​​2,思路​​

​​3,AC代碼​​

​​4,解題過程​​

1,題目描述

PAT_甲級_1149 Dangerous Goods Packaging (25point(s)) (C++)【STL應用】

Sample Input:

6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006
4 00001 20004 00002 20003
5 98823 20002 20003 20006 10010
3 12345 67890 23333      

Sample Output:

No
Yes
Yes      

題目大意

部分商品對應着不能與另外一些商品放在一起,給出這樣的相克關系,以及若幹張購物清單,說明每張購物清單上的物品是否可以放在一起。

2,思路

1,unordered_map<int, vector<int>> record:記錄與每個物品的相克的商品:

PAT_甲級_1149 Dangerous Goods Packaging (25point(s)) (C++)【STL應用】

2,将清單上的物品存入temp中,周遊temp上的物品,對每一個物品,判斷其所相克的對象(可能不止一個)是否存在于temp中:

PAT_甲級_1149 Dangerous Goods Packaging (25point(s)) (C++)【STL應用】

3,AC代碼

#include<bits/stdc++.h>
using namespace std;
int N, M, K;
unordered_map<int, vector<int>> record;//與每個物品的相克的可能不止一種
int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
    scanf("%d%d", &N, &M);
    int a, b, id;
    for(int i = 0; i < N; i++){
        scanf("%d%d", &a, &b);
        record[a].push_back(b);
        record[b].push_back(a);
    }
    while(M--){
        scanf("%d", &K);
        unordered_set<int> temp;
        bool flag = true;
        while(K--){
            scanf("%d", &id);
            temp.insert(id);
        }
        for(auto i : temp){             //周遊每個temp中的物品
            for(auto j : record[i]){    //對每個temp中的物品 周遊其不能同時存放的物品
                if(find(temp.begin(), temp.end(), j) != temp.end()){//查找不和諧物品是否存在于temp中
                    flag = false;
                    break;
                }
            }
            if(flag == false) break;
        }
        printf("%s\n", flag ? "Yes" : "No");
    }
    return 0;
}      

4,解題過程

繼續閱讀