http://acm.hdu.edu.cn/showproblem.php?pid=3335

题意:在给出的n个数中找出一个集合,使得其中的数互不整除,求该集合最大的元素数量

首先要对输入的数去重,输入的数是64位的,开始没用__int64坑了好久

一上来我以为是求二分图最大独立集,利用相反的关系建边(整除即连边),再用n去减,这样发现没过样例(因为拆点了,求得的最大匹配数要除以二),想了下发现这个解法的bug,用最大独立集求出来的互不整除的最多元素每两个之间关系是双向的,相互不整除,a不整除b并且b不整除a。但是题目的互不整除是单向的,a%b和b%a有一个为0就行。举个例子 1 2这组数,题目中不能放在一组,但是用最大独立集算,这两个就会放在一起。

接着去搜解题报告,发现能解释的不多,都是直接给出结论的,好不容易找到一篇

http://blog.sina.com.cn/s/blog_717d944e0100qxl0.html

元素互不整除的集合最大数量 由Dilworth's定理得到一个等价问题:用最少的划分,每个划分集合两两可以整除

后面那个问题确实可以转化为最小路径覆盖,即把每个数看做点,整除关系看做边

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <map>
  5. #include <cmath>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. typedef __int64 ll;
  10.  
  11. struct node{
  12. int s,t,nxt ;
  13. }e[] ;
  14. int k,m,n,head[],cnt,match[],vis[] ;
  15. int find(int s)
  16. {
  17. for(int i=head[s] ;i!=- ;i=e[i].nxt)
  18. {
  19. int tt=e[i].t ;
  20. if(!vis[tt])
  21. {
  22. vis[tt]= ;
  23. if(match[tt]==- || find(match[tt]))
  24. {
  25. match[tt]=s ;
  26. return ;
  27. }
  28. }
  29. }
  30. return ;
  31. }
  32. int max_match()
  33. {
  34. int ans= ;
  35. memset(match,-,sizeof(match)) ;
  36. for(int i= ;i<=n ;i++)
  37. {
  38. memset(vis,,sizeof(vis)) ;
  39. ans+=find(i);
  40. }
  41. return ans;
  42. }
  43. void add(int s,int t) {e[cnt].s=s ;e[cnt].t=t ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;}
  44.  
  45. ll a[],b[];
  46.  
  47. void read_graph()
  48. {
  49. memset(head,-,sizeof(head)) ;
  50. cnt= ;
  51. for(int i=;i<=n;i++){
  52. for(int j=;j<=n;j++){
  53. if(i==j)continue;
  54. if(b[i]%b[j]==)
  55. add(i,j);
  56. }
  57. }
  58. }
  59.  
  60. int main(){
  61. int T;
  62. scanf("%d",&T);
  63. while(T--){
  64. scanf("%d",&n);
  65. for(int i=;i<=n;i++){
  66. scanf("%I64d",&a[i]);
  67. }
  68. int st=;
  69. sort(a+,a++n);
  70. b[++st]=a[];
  71. for(int i=;i<=n;i++){
  72. if(a[i]!=a[i-])b[++st]=a[i];
  73. }
  74. n=st;
  75. read_graph();
  76. printf("%d\n",n-max_match());
  77. }
  78. return ;
  79. }

HDU 3335的更多相关文章

  1. HDU 3335 Divisibility (DLX)

    Divisibility Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  2. HDU 3335 Divisibility dancing links 重复覆盖

    分析: dlx重复覆盖的巧用,重复覆盖的原理恰好符合本题的筛选方式,即选择一个数后,该数的倍数或约数可以保证在之后的搜索中不会被选择 于是修改一下启发函数,求解最大的重复覆盖即可.   其实不一定不被 ...

  3. 最小路径覆盖 hdu 1151 hdu 3335

    Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. (中等) HDU 3335 , DLX+重复覆盖。

    Description As we know,the fzu AekdyCoin is famous of math,especially in the field of number theory. ...

  5. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  6. Dancing Links [Kuangbin带你飞] 模版及题解

    学习资料: http://www.cnblogs.com/grenet/p/3145800.html http://blog.csdn.net/mu399/article/details/762786 ...

  7. Dancing Link专题

    一些链接: http://www.cnblogs.com/-sunshine/p/3358922.html http://www.cnblogs.com/grenet/p/3145800.html 1 ...

  8. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  9. pat l2-14 列车调度 dilworth+nlog(n)最长上升子序列

    关于dilworth定理 这里引用一个大神的(http://blog.csdn.net/xuzengqiang/article/details/7266034) 偏序的概念: 设A是一个非空集,P是A ...

随机推荐

  1. iOS 10 消息推送(UserNotifications)秘籍总结(一)

    前言 之前说会单独整理消息通知的内容,但是因为工(就)作(是)的(很)事(懒)没有更新文章,违背了自己的学习的初衷.因为互联网一定要有危机意识,说不定眼一睁,我们就out丢了饭碗. 图片来源网络.jp ...

  2. oracle 里面定时执行任务,比如存储过程内容等

    DECLARE   job_no_ NUMBER;   BEGIN      DBMS_JOB.SUBMIT(job_no_,                   'proc_qszx_dw_sc(' ...

  3. [整理]Linux压缩与解压缩命令整理。

    一.压缩文件命令 1.*.Z compress 程序压缩的档案:2.*.bz2 bzip2 程序压缩的档案:3.*.gz gzip 程序压缩的档案:4.*.tar tar 程序打包的数据,并没有压缩过 ...

  4. tar 排除指定目录 –exclude

    假设 test目录下有 1 2 3 4 5 这5个目录, 1下有6 7两个目录, 现在要将3 4 5 6目录tar打包,2和1下的6这两个目录不要.命令如下: Example[www]#cd test ...

  5. 在vim中执行外部命令

    11.7.5  在Vim编辑器中执行Shell命令 有时需要在Vim编辑器中执行Shell命令,例如需要验证一个Shell命令是否正确,以便写入脚本中:需要在文件中引用某个Shell命令的输入等.本小 ...

  6. jdk、jre、jvm的关系

    JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C:\Program Files\Java\jdk1.5.x\目录下的JRE.而C:\Program Files\Java\ ...

  7. 深入理解Redis:命令处理流程

    Redis是著名的NoSQL键值数据库服务器,为了保证效率,其数据都缓存在内存中.与Memcached相比,Redis支持的数据类型更多,包括String,List,Set,Zset和Hash.下面简 ...

  8. POJ 2255 Tree Recovery 树的遍历,分治 难度:0

    http://poj.org/problem?id=2255 #include<cstdio> #include <cstring> using namespace std; ...

  9. 都是以父元素的width为参照物的

    本文依赖于一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素的width为参照物的!也许你会说, ...

  10. [C/C++]C/C++相关网站

    1.http://en.cppreference.com What is the purpose of this site? Our goal is to provide programmers wi ...