您的位置:首页 > 其它

poj 1466 Girls and Boys(最大独立…

2013-04-23 09:23 218 查看
题意:有girls and boys 他们有些人之间有关系 选出M个人 让这M个人没联系

思路:因为不知道谁是男的女的,所以都放一块 这样就形成了无向的二分图 所以最大独立集 = n - 最大匹配/2;

边表(4XXMS)实现 比矩阵(38XXMS)快多了

1466 Girls and Boys(最大独立集)" TITLE="poj 1466 Girls and Boys(最大独立集)" />

#include <stdio.h>

#include <string.h>

#define VM 505

#define EM 10000

struct E

{

int
v,next;

}edge[EM];

int head[VM],link[VM],vis[VM],xM[VM];

int p,n;

void addedge (int cu,int cv)

{

edge[p].v =
cv;

edge[p].next
= head[cu];

head[cu] = p
++;

}

int DFS (int u)

{

int v;

for (int i =
head[u];i != -1;i = edge[i].next)

{

v = edge[i].v;

if (!vis[v])

{

vis[v] = 1;

if(link[v] == -1||DFS(link[v]))

{

link[v] = u;

xM[u] = v;

return 1;

}

}

}

return
0;

}

int gunary ()

{

int u,res =
0;

memset
(link,-1,sizeof(link));

memset
(xM,-1,sizeof(xM));
//加个数组优化,发现时间没少啊!!!

1466 Girls and Boys(最大独立集)" TITLE="poj 1466 Girls and Boys(最大独立集)" />

for (u = 0;u
< n;u ++)

if (xM[u] == -1)

{

memset (vis,0,sizeof(vis));

if (DFS(u))

res ++;

}

return
res;

}

int main ()

{

int
u,v,m;

while
(~scanf
("%d",&n))
//这个取反高明 学来的

{

p = 0;

memset (head,-1,sizeof(head));

for (int i = 0;i < n;i ++)

{

scanf ("%d: (%d)",&u,&m);

while (m --)

{

scanf ("%d",&v);

addedge (u,v);

}

}

int ans = gunary();

printf ("%d\n",n - ans/2);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: