题意:有girls and boys 他们有些人之间有关系 选出M个人 让这M个人没联系
思路:因为不知道谁是男的女的,所以都放一块 这样就形成了无向的二分图 所以最大独立集 = n - 最大匹配/2;
边表(4XXMS)实现 比矩阵(38XXMS)快多了
#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));
//加个数组优化,发现时间没少啊!!!
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)快多了

#include <stdio.h>
#include <string.h>
#define VM 505
#define EM 10000
struct E
{
}edge[EM];
int head[VM],link[VM],vis[VM],xM[VM];
int p,n;
void addedge (int cu,int cv)
{
}
int DFS (int u)
{
}
int gunary ()
{

}
int main ()
{
}
本文介绍了解决POJ 1466 Girls and Boys问题的方法,利用无向二分图的最大匹配算法求解最大独立集。通过边表实现,提高了算法效率。
1651

被折叠的 条评论
为什么被折叠?



