描述:
这几天做题,大程序写出来了,总犯点小错误,犯小错误也就算了,还是总是找不出来,浪费时间!
坑爹啊!//这是一道二分图最大匹配问题,蛋疼!偷瞄了学长的解题报告!《- 。-》
方法
:
选出n个数,任意两个数之间不能出现整除的情况,把能整除的都建边, 要求的就是任意两个之间没有公共边的,
就是最大独立集,用最小路径覆盖同样可以。
#include"stdio.h"
#include"string.h"
int
map[1010][1010],link[1010],mark[1010];
int
n;
__int64
a[1010];
int
find(
int
k)
{
int
i;
for
(i=1;i<=n;i++)
{
if
(!mark[i]&&map[k][i])
{
mark[i]=1;
if
(!link[i]||find(link[i]))
{
link[i]=k;
return
1;
}
}
}
return
0;
}
int
main()
{
int
i,j,t,ans;
scanf
(
"%d"
,&t);
while
(t--)
{
memset
(map,0,
sizeof
(map));
memset
(link,0,
sizeof
(link));
scanf
(
"%d"
,&n);
for
(i=1;i<=n;i++)
scanf
(
"%I64d"
,&a[i]);
for
(i=1;i<=n;i++)
for
(j=1;j<i;j++)
{
if
(a[i]%a[j]==0||a[j]%a[i]==0)
map[j][i]=1;
}
ans=0;
for
(i=1;i<=n;i++)
{
memset
(mark,0,
sizeof
(mark));
if
(find(i))
ans++;
}
printf
(
"%d\n"
,n-ans);
}
return
0;
}
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3335