博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #576 (Div. 1) C. Matching vs Independent Set(思维好题)
阅读量:3928 次
发布时间:2019-05-23

本文共 820 字,大约阅读时间需要 2 分钟。

在这里插入图片描述
在这里插入图片描述
题意:给出一个图包括3∗n个点和m条边,一个边的集合定义如下,边的两端点只能属于一条边;一个点的集合定义如下:没有一条边把任意两个点连接。如果有这样的一个大小是n的边的集合,输出"Matching"和边按输入顺序的序号,如果有这样一个大小是n的点的集合,输出”IndSet“和点的序号,如果都没有,输出”Impossible“。(∑n≤1e5,∑m≤5e5)。
思路:这个思维也真的清奇,一开始疯狂想着是不是可以用并查集来解决,但复杂度都太大,结果一看题解才发现是水题(QAQ),我们可以枚举给出的m条边,暴力找一下是否存在数量大于等于n的边的集合,具体做法就是如果一条边的两边都没有被标记,说明这条边可以被加入集合,如果存在直接输出matching就可以了,那么如果不存在呢?这里就是考察思维的地方了,如果不存在,说明被边的集合数量小于n,被标记的点的数量小于2n,那么剩余的没有被标记的为3n-2*n一定大于n,而没有被标记的点一定满足点的集合的定义,直接输出就行,所以不存在没有答案的情况。

#include
using namespace std;const int maxn=5e5+5;vector
ans;int T,n,m,u,v,vis[maxn];int main(){
scanf("%d",&T); while(T--) {
ans.clear(); scanf("%d %d",&n,&m); for(int i=0;i<=3*n+1;++i) vis[i]=0; for(int i=1;i<=m;++i) {
scanf("%d %d",&u,&v); if(!vis[u]&&!vis[v]) {
vis[u]=vis[v]=1; ans.push_back(i); } } if(ans.size()

转载地址:http://fbign.baihongyu.com/

你可能感兴趣的文章
网络穿透与音视频技术(3)——NAT映射检测和常见网络穿越方法论(NAT检测)...
查看>>
网络穿透与音视频技术(2)——NAT的概念及工作模式(下)
查看>>
怎样在IDEA中查看GC日志
查看>>
从数组形式创建一棵树(用于leetcode测试)
查看>>
Spring/Boot/Cloud系列知识(2)——代理模式
查看>>
线程进阶:多任务处理(17)——Java中的锁(Unsafe基础)
查看>>
Spring/Boot/Cloud系列知识(1)——开篇
查看>>
线程基础:多任务处理(15)——Fork/Join框架(要点2)
查看>>
线程基础:多任务处理(16)——Fork/Join框架(排序算法性能补充)
查看>>
线程基础:多任务处理(14)——Fork/Join框架(要点1)
查看>>
线程基础:多任务处理(13)——Fork/Join框架(解决排序问题)
查看>>
架构设计:系统存储(15)——Redis基本概念和安装使用
查看>>
架构设计:系统存储(13)——MySQL横向拆分与业务透明化(1)
查看>>
架构设计:系统存储(12)——MySQL主从方案业务连接透明化(中)
查看>>
架构设计:系统存储(14)——MySQL横向拆分与业务透明化(2)
查看>>
架构设计:系统存储(5)——MySQL数据库性能优化(1)
查看>>
架构设计:系统存储(2)——块存储方案(2)
查看>>
架构设计:系统间通信(45)——阶段性问题记录
查看>>
架构设计:系统间通信(44)——自己动手设计ESB(5)
查看>>
架构设计:系统存储(1)——块存储方案(1)
查看>>