现在的位置: 首页 > 综合 > 正文

poj 1466 Girls and Boys(最大独立…

2018年03月17日 ⁄ 综合 ⁄ 共 959字 ⁄ 字号 评论关闭
题意:有girls and boys 他们有些人之间有关系 选出M个人 让这M个人没联系

思路:因为不知道谁是男的女的,所以都放一块 这样就形成了无向的二分图 所以最大独立集 = n - 最大匹配/2;
边表(4XXMS)实现 比矩阵(38XXMS)快多了poj <wbr>1466 <wbr>Girls <wbr>and <wbr>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));       
//加个数组优化,发现时间没少啊!!!poj <wbr>1466 <wbr>Girls <wbr>and <wbr>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))               
//这个取反高明 学来的
    {

抱歉!评论已关闭.