poj 1466 Girls and Boys(最大独立…

本文介绍了解决POJ 1466 Girls and Boys问题的方法,利用无向二分图的最大匹配算法求解最大独立集。通过边表实现,提高了算法效率。
题意:有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))                //这个取反高明 学来的
    {
        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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值