1 3 1 2 3
2 Hint: If we choose 2 and 3,one is not divisible by the other,which is the most number you can choose.
题意:给你n个数,选最多的数使得两两之间不能整除。
题解:最大独立集 = 点数 - 二分图最大匹配
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<iostream>
#define N 30030
#define M 100100
#define ll long long
using namespace std;
const int MAXN = 1010;
int n;
int g[MAXN][MAXN];
int linker[MAXN];
bool used[MAXN];
bool dfs(int u) {
for(int v = 0; v < n; v++)
if(g[u][v] && !used[v]) {
used[v] = true;
if(linker[v] == -1 || dfs(linker[v])) {
linker[v] = u;
return true;
}
}
return false;
}
int hungary() {
int res = 0;
memset(linker,-1,sizeof(linker));
for(int u = 0; u < n; u++) {
memset(used,false,sizeof(used));
if(dfs(u))res++;
}
return res;
}
ll a[MAXN];
int main() {
//freopen("test.in","r",stdin);
int t;
cin>>t;
while(t--) {
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%I64d",&a[i]);
memset(g,0,sizeof g);
sort(a,a+n);
int ans=0;
for(int i=0; i<n; i++) {
for(int j=i+1; j<n; j++) {
if(a[j]%a[i]==0) {
g[i][j]=1;
}
}
}
printf("%d\n",n-hungary());
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/47739343