题目链接:分而治之

这道题跟图着色那道原理很一样。题目链接:L2-023 图着色问题 (25分)
本题核心:如果一条边其中一端点被选中就可行。若这条边的两个端点都没有在输入的方案里面,就不可行。

用一个一维数组存放m条边,pair成对存放边上的两个端点
用set存放方案的点,遍历每条边,判断是否有不可行的边

#include<iostream>
#include<vector>
#include<set>

using namespace std;

#define PII pair<int,int>

const int N = 1e4 + 10;

vector<PII> mp(N);

int n,m,k;

int main() {
    scanf("%d %d",&n,&m);
    for(int i = 0; i < m; i ++ ){
        cin >> mp[i].first >> mp[i].second;
    }
    scanf("%d",&k);
    while(k -- ){
        int cnt = 0;
        scanf("%d",&cnt);
        set<int > s;
        for(int i = 0; i < cnt; i ++ ){
            int x; scanf("%d",&x);
            s.insert(x);
        }
        bool ans = true;
        for(int i = 0; i < m; i ++ ){
            if(s.find(mp[i].first) == s.end() && s.find(mp[i].second) == s.end())
                ans = false;
        }
        if(ans) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}