题目链接:分而治之
这道题跟图着色那道原理很一样。题目链接: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;
}