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