您的位置:首页 > 其它

hdu 3335 最大独立集,疑惑

2015-07-27 18:48 267 查看
有整除关系就建边,然后求最大独立集,不过还是不懂为什么建双向边hunagry返回结果除以2就会WA。

单向建边的AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int N = 1001;
const int M = 1000000;
bool visit
;
__int64 a
;
int head
;
int mark
;
int n, e;

struct Edge
{
int v, next;
} edge[M];

void addEdge( int u, int v )
{
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
}

int dfs( int u )
{
for ( int i = head[u]; i != -1; i = edge[i].next )
{
int v = edge[i].v;
if ( !visit[v] )
{
visit[v] = true;
if ( mark[v] == -1 || dfs( mark[v] ) )
{
mark[v] = u;
return 1;
}
}
}
return 0;
}

int hunagry()
{
memset( mark, -1, sizeof(mark) );
int res = 0;
for ( int i = 1; i <= n; i++ )
{
memset( visit, 0, sizeof(visit) );
res += dfs(i);
}
return res;
}

int main()
{
int t;
scanf("%d", &t);
while ( t-- )
{
e = 0;
memset( head, -1, sizeof(head) );
scanf("%d", &n);
for ( int i = 1; i <= n; i++ )
{
scanf("%I64d", a + i);
for ( int j = i - 1; j > 0; j-- )
{
if ( a[i] % a[j] == 0 || a[j] % a[i] == 0 )
{
addEdge( j, i );
}
}
}
int ans = n - hunagry();
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: