L2-025 分而治之 (25分)

题目链接:分而治之

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值