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定理得到一个等价问题:用最少的划分,每个划分集合两两可以整除

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <cmath>
#include <algorithm>
using namespace std; typedef __int64 ll; struct node{
int s,t,nxt ;
}e[] ;
int k,m,n,head[],cnt,match[],vis[] ;
int find(int s)
{
for(int i=head[s] ;i!=- ;i=e[i].nxt)
{
int tt=e[i].t ;
if(!vis[tt])
{
vis[tt]= ;
if(match[tt]==- || find(match[tt]))
{
match[tt]=s ;
return ;
}
}
}
return ;
}
int max_match()
{
int ans= ;
memset(match,-,sizeof(match)) ;
for(int i= ;i<=n ;i++)
{
memset(vis,,sizeof(vis)) ;
ans+=find(i);
}
return ans;
}
void add(int s,int t) {e[cnt].s=s ;e[cnt].t=t ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;} ll a[],b[]; void read_graph()
{
memset(head,-,sizeof(head)) ;
cnt= ;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j)continue;
if(b[i]%b[j]==)
add(i,j);
}
}
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%I64d",&a[i]);
}
int st=;
sort(a+,a++n);
b[++st]=a[];
for(int i=;i<=n;i++){
if(a[i]!=a[i-])b[++st]=a[i];
}
n=st;
read_graph();
printf("%d\n",n-max_match());
}
return ;
}

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. jquery iframe高度自适应

    $(document).ready(function () { $("#test").load(function () { var thisheight = $(this).con ...

  2. 5 echo展开

    一.(字符)展开 1.echo在标准输出中打印出他的文本 echo this is a test 输出 this is a test 2.输出通配符时,比如*代表匹配文件名的任何字符 echo * 输 ...

  3. C#.web 打开PDF

    转自:http://blog.163.com/red_guitar@126/blog/static/11720612820112483221665/ string fileName = "2 ...

  4. 关于SQL语句优化的一个问题

    今天写了一个很简单的存储过程,结果一执行,40多秒,后来调整了一句话写法,瞬间出来,其实差别不大,如下: select item_no=vpc.ITEM_ID ,BL_QTY=sum(vpc.QTY_ ...

  5. 循环语句while与for的穷举迭代

    循环语句while while当...的时候 int n=1; while(n<6)//在括号内直接限制逻辑关系 {//需要在大括号内给出改变方式,否则将进入死循环 console.WriteL ...

  6. guava学习--Optional可空类型

    转载:http://www.cnblogs.com/whitewolf/p/4231783.html Null sucks 回到本文主题Optional.在我日常编程中NullPointerExcep ...

  7. 什么是 Unix 以及它为什么这么重要?

    大多数操作系统可以被划分到两个不同的家族.除了微软的基于Windows NT的操作系统外,几乎所有其他的都可以追溯到Unix. Linux,Mac OS X,Android,iOS,Chrome OS ...

  8. LZMA demo挑选使用备忘

    一.源码下载:http://sourceforge.net/projects/sevenzip/ 二.各种EXE及其功能 代码里面有很多的dsw工程,功能不一,size不一,需要挑选合适的加入到自己的 ...

  9. Countries in War (POJ 3114) Tarjan缩点+最短路

    题目大意: 在一个有向图中,每两点间通信需要一定的时间,但同一个强连通分量里传递信息不用时间,给两点u,v求他们最小的通信时间.   解题过程: 1.首先把强连通分量缩点,然后遍历每一条边来更新两个强 ...

  10. select2去除搜索框

    $("#type_select").select2({ minimumResultsForSearch: -1 });