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);
}
}
思路:因为不知道谁是男的女的,所以都放一块 这样就形成了无向的二分图 所以最大独立集 = 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);
}
}
相关文章推荐
- POJ 1466 Girls and Boys 求最大独立点集
- POJ 1466 && ZOJ 1137--Girls and Boys【二分图 && 最大点独立集】
- poj1466——Girls and Boys(最大独立点集)
- POJ 1466 Girls and Boys (ZOJ 1137 )最大独立点集
- POJ 1466 Girls and Boys (ZOJ 1137 )最大独立点集
- poj 1466 && hdu 1068Girls and Boys(最大独立集)
- POJ 1466 Girls and Boys(最大独立点集)
- 网络流(最大独立点集):POJ 1466 Girls and Boys
- POJ 1466 Girls and Boys(最大独立点集)
- poj 1466 Girls and Boys 二分图-最大独立子集
- poj 1466 Girls and Boys (最大独立)
- poj 1466 Girls and Boys (最大独立)
- POJ 1466 Girls and Boys (最大独立点集)
- zoj 1137 Girls and Boys(poj 1466)(最大独立点集)
- POJ-1466 Girls and Boys (二分图最大独立集)
- POJ Girls and Boys (最大独立点集)
- poj 1466 Girls and Boys (最大独立集)
- poj 1466 Girls and Boys (二分图最大独立集)
- POJ-1466-Girls and Boys(二分图最大独立集)
- POJ 1466 Girls and Boys(二分图最大独立集)