[最小径径覆盖]hdoj 3335:Divisibility
[最小路径覆盖]hdoj 3335:Divisibility
大致题意:
给出不超过1000个数字,现在要取出k个数字,使得这k个数字两两之间互质,问k最大是多少。
大致思路:
把问题转化为二分图最大匹配问题,把每个点i拆做 i 和 i' ,如果a>b且a可以整除b则连接a->b'。求出最小路径覆盖即可。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; const int nMax=1005; int n,m; long long num[nMax]; bool map[nMax][nMax]; bool vis[nMax]; int linkk[nMax]; int dfs(int s){ for(int i=0;i<m;i++){ if(!vis[i]&&map[s][i]){ vis[i]=1; if(linkk[i]==-1||dfs(linkk[i])){ linkk[i]=s; return 1; } } } return 0; } int main(){ int cas,i,j; cin>>cas; while(cas--){ cin>>n; m=n; memset(map,0,sizeof(map)); for(i=0;i<n;i++){ cin>>num[i]; } sort(num,num+n); for(i=n-1;i>=0;i--){ for(j=0;j<i;j++){ if(num[i]%num[j]==0){ map[i][j]=1; } } } int ans=0; memset(linkk,-1,sizeof(linkk)); for(i=0;i<n;i++){ memset(vis,0,sizeof(vis)); if(dfs(i))ans++; } ans=n-ans; cout<<ans<<endl; } return 0; }