题意:给n个数,从中取最多的数使两两之间不能整除。
二分图的最大独立集,在集合中取最多的点使这些点两两之间没有边。听这个定义就应该知道怎么做了,最大独立集=n-最大匹配。
边就代表整除关系。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
int map[maxn][maxn],match[maxn],n;
__int64 num[maxn];
bool mark[maxn];
bool DFS(int u)
{
int i,t;
for( i=0;i<n;i++){
if( !mark[i]&&map[u][i]){
mark[i]=true;
if( match[i]==-1||DFS(match[i])){
match[i]=u;
return true;
}
}
}
return false;
}
int Maxmah()
{
int i,ans;
ans=0;
memset(match,-1,sizeof(match));
for( i=0;i<n;i++){
memset(mark,false,sizeof(mark));
if( DFS(i))
ans++;
}
return ans;
}
bool cmp(__int64 a,__int64 b)
{
return a>b;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while( t--){
scanf("%d",&n);
memset(num,0,sizeof(num));
memset(map,0,sizeof(map));
for( i=0;i<n;i++)
scanf("%I64d",&num[i]);
sort(num,num+n,cmp); //从大到小排序
for( i=0;i<n;i++)
for( j=i+1;j<n;j++)
if(num[i]%num[j]==0)
map[i][j]=1;
printf("%d\n",n-Maxmah());
}
return 0;
}