PTA1090 危險品裝箱 (25分)詳解

qq_45849364發表於2020-11-17

傳送門

1090 危險品裝箱 (25分)詳解

資料:
6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006

本題分析

  1. 題目的關鍵在於如何解決編號不相容問題,由以上資料可知,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;
}

相關文章