hdu335(最小覆盖)

来源:互联网 发布:mes 生产优化调度算法 编辑:程序博客网 时间:2024/06/05 03:32

点击打开链接


给你n个数,求,最少留下几个数,可以使,两两不能被整除。。。



求出两两被整除的最大匹配,然后n减。

注意可能出现相同的数字。。


#include"stdio.h"#include"string.h"#include"algorithm"using namespace std;#define N 1005typedef __int64 LL;int n;LL A[N];int set[N];int map[N][N];int mark[N];int bfs(int x){int i;for(i=0;i<n;i++){if(!mark[i]){if(map[x][i]){mark[i]=1;if(set[i]==-1||bfs(set[i])){set[i]=x;return 1;}}}}return 0;}int main(){int T;int i,j;scanf("%d",&T);while(T--){scanf("%d",&n);for(i=0;i<n;i++)scanf("%I64d",&A[i]);sort(A,A+n);int m=1;for(i=1;i<n;i++){if(A[i]!=A[i-1])A[m++]=A[i];}n=m;memset(map,0,sizeof(map));for(i=0;i<n;i++){for(j=i+1;j<n;j++)if(A[j]%A[i]==0)map[j][i]=1;}memset(set,-1,sizeof(set));int ans=0;for(i=0;i<n;i++){memset(mark,0,sizeof(mark));if(bfs(i))ans++;}printf("%d\n",n-ans);}return 0;}


求出两两被整除的最大匹配,然后n减。



求出两两被整除的最大匹配,然后n减。