题意:有n组数,每组包含两个数,问在每组只能取一个的前提下能组成的最长的从1开始的连续自然数有几个?

分析:刚学了差分约束系统,很容易往转换成图的方向去想

将他读入的这n组数当成边读入

很容易会得到一个图,这个图不一定是连通的,

我们暂时先把他所有极大连通子图划分为两种:一种是 属于树的,另一种是 不属于树的

显然,1234是属于树的,而5678则不属于树

对于树来说,显然n个节点的树只能选出n-1个节点来,

这个是很容易证明的,如果我们把不选的那个节点作为根节点,那么显然其他的节点是都可以选的,每个节点只需要用其连向父亲的边即可

再考虑图,其实我们依然可以将每个环缩成点,然后继续考虑缩完点之后剩下的树

首先,对于一颗树来说刚刚已经证明了根节点不选,别的节点都选是最优的

而对于一个环来说一定所有节点都是可以选的,这是显然的

那么如果我将这个环缩成的点作为根,虽然这个环没法在树中被选

但这个环中的每个元素都是被选的

也就是说,只要这个极大连通子图不是树就一定所有节点都能选

而对于树来说,会有一个节点是不能选的,那肯定是让最大的不选是最优的

所以只需要用并查集判断是否是树,如果是树再记录一下最大值即可

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. const int maxn=1e4+;
  7.  
  8. int fa[maxn];
  9. int mxp[maxn];
  10.  
  11. int find(int x)
  12. {
  13. while(x!=fa[x]) x=fa[x];
  14. return x;
  15. }
  16.  
  17. int ya(int x)
  18. {
  19. int fax=find(x),nowfa;
  20. while(x!=fax)
  21. {
  22. nowfa=fa[x];
  23. fa[x]=fax;
  24. x=nowfa;
  25. }
  26. return fax;
  27. }
  28.  
  29. void bing(int x,int y)
  30. {
  31. int fax=ya(x),fay=ya(y);
  32. if(fax==fay) mxp[fax]=maxn;
  33. else fa[fay]=fax,mxp[fax]=max(mxp[fax],mxp[fay]);
  34. }
  35.  
  36. int main()
  37. {
  38. int n,x,y;
  39. for(int i=;i<maxn;i++) fa[i]=mxp[i]=i;
  40. scanf("%d",&n);
  41. while(n--)
  42. {
  43. scanf("%d%d",&x,&y);
  44. bing(x,y);
  45. }
  46. int ans=maxn;
  47. for(int i=;i<maxn;i++) ya(i);
  48. for(int i=;i<maxn;i++) ans=min(ans,mxp[fa[i]]);
  49. printf("%d",ans-);
  50. return ;
  51. }

题目分享G 二代目的更多相关文章

  1. 题目分享E 二代目

    题意:一棵点数为n的树,每个节点有点权,要求在树中中找到一个最小的x,使得存在一个点满足max(该点点权,该点相邻的点的点权+1,其他点的点权+2)=x 分析:首先要能把题目转化为上述题意 首先题目让 ...

  2. 题目分享D 二代目

    题意:给定一个T条边的无向图,求S到E恰好经过N条边的最短路径 T≤100 N≤1000000 分析:(据说好像假期学长讲过) 首先很容易想到的是dp[i][j][k]表示从i到j经过k条边的最短路径 ...

  3. 题目分享C 二代目

    题意:一个数列是由 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6.....组成,也就是1-1,1-2,1-3......并且如果遇到多位数也要拆成数字比如1-10 ...

  4. 题目分享H 二代目

    题意:有m个限制,每个限制l1,r1,l2,r2四个数,限制了一个长度为n的数第l1到r1位要与第l2到r2相同,保证r1-l1=r2-l2,求在限制下一共有多少种数 分析: 暴力的话肯定是从l1-r ...

  5. 题目分享F 二代目

    题意:T个点R种双向边,P种单向边,求点S到每个点的最短距离 分析:(这再看不出来是spfa就该**了) 首先,这题能否用spfa就看他是否有负环呗,显然,双向边的权值非负,单向边还有个啥政策,总之显 ...

  6. 郑轻校赛题目 问题 G: 多少个0

    问题 G: 多少个0 时间限制: 1 Sec  内存限制: 128 MB提交: 192  解决: 40 题目描述 一个n*n的方格,每个格子中间有一个数字是2或者5,现在从方格的左上角走到右下角,每次 ...

  7. 2019年腾讯PHP程序员面试题目分享

    有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群​jq.qq.com 1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除 ...

  8. 20190924-LeetCode解数独题目分享

    解决数独 题目描述 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以 ...

  9. 题目分享X

    题意:一张票有n位数,如果这张票的前一半数字的和等于后一半数字的和(n一定是偶数),就称这张票为快乐票.有些数被擦除了,标记为’?’(’?‘的个数也是偶数),现在Monocarp 和 Bicarp 进 ...

随机推荐

  1. python selenium使用

    安装selenium #Python pip install selenium #Anaconda3 conda install selenium 下载浏览器版本对应的驱动文件 chrome chro ...

  2. hadoop(七)集群配置同步(hadoop完全分布式四)|9

    前置配置:rsync远程同步|xsync集群分发(hadoop完全分布式准备三)|9 1. 分布式集群分配原则 部署分配原则 说明Namenode和secondarynamenode占用内存较大,建议 ...

  3. JS 的事件基础、事件侦听与抛发、

    前言 JavaScript是一种事件驱动型语言.事件驱动是指JavaScript引擎并不是在看到代码之后就会立即执行,而是会在合适的时间才去执行.这个合适的时间是指当某个事件发生之后(例如一个输入框的 ...

  4. 面试 HTTP ,99% 的面试官都爱问这些问题

    HTTP 和 HTTPS 的区别 HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol),HTTP 是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超 ...

  5. Candy Distribution

    Kids like candies, so much that they start beating each other if the candies are not fairly distribu ...

  6. Python中关于第三方库的补充

    Python语言的强大之处在于它的开源.正是因为它的开源,产生了成百上千的第三方库,涵盖了计算机的几乎所有的方向.第三方库的安装也并不是特别的复杂,通过在cmd中使用pip命令可以安装几乎所有的库,但 ...

  7. 你自学半年也搞不懂的go底层,看这篇。这篇讲 go的数组、切片、Maps

    目录 数组 1.定义数组 2.使用数组 3.定义并赋值 4.数组的大小是类型的一部分 5.数组是值类型(当参数传递到函数中,修改不会改变原来的值) 6.数组长度 7.循环数组 8.多维数组 切片 1. ...

  8. .NET中 kafka消息队列、环境搭建与使用

    前面几篇文章中讲了一些关于消息队列的知识,就每中消息队列中间件,我们并没有做详细的讲解,那么,今天我们就来详细的讲解一下消息队列之一kafka的一些基本的使用与操作. 一.kafka介绍 kafka: ...

  9. Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑

    简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...

  10. python函数-易错知识点

    定义函数: def greet_users(names): #names是形参 """Print a simple greeting to each user in th ...