二分图的独立数

二分图的最大独立数+poj 题目汇总

入门题:POJ1466

想用C练练手,于是抄的是这里,为了省事抄的是现成的C++,但是不知为什么TLE了,这位的代码可以AC,理论上他用的邻接矩阵更慢才对啊。

总之,记住二分图最大独立数=顶点数-最大匹配数

另外,这道题没有直接标明哪个是boy哪个是girl,原来以为要自己判断一下,但是根据别人的程序,直接求匹配数/2即为实际匹配的数目,其实并不难,纸上画一下就能理解了,求到右边的节点时因为左边的结点link都为0,所以匹配数多算了一次。

《算法艺术与信息学竞赛》P332

我的TLE代码

#include <stdio.h>
#include <string.h>
#define MAXN 505

int g[MAXN][MAXN],link[MAXN];
bool used[MAXN];
int n, nx, ny, match;

bool find(int x)
{
    for (int i = 1; i <= g[x][0]; i++)
    {
        int k = g[x][i];
        if (!used[k])
        {
            used[k] = true;
            if (link[k] == -1 || find(link[k])            )
            {
                link[k] = x;
                return true;
            }
        }
    }
    return false;
}

void hungary()
{
    memset(link, -1, sizeof(link));
    for (int i = 0; i < nx; i++)
    {
        memset(used, false, sizeof(used));
        if (find(i))
            match++;
    }
}

int main()
{
    int n;
    while (scanf("%d", &n)!=EOF)
    {
        nx = ny = n;
        for (int i = 0; i < nx; i++)
        {
            int x;
            char c,cc,str[10];
            scanf("%d%c", &x,&c);
            g[x][0] = 0;
            scanf(" %c%d%c",&c, &g[x][0], &cc);
            for (int j = 1; j <= g[x][0]; j++)
              scanf("%d",&g[x][j]);
            match = 0;
            hungary();
        }
        printf("%d\n",nx-match/2);
    }
    return 0;
}

posted on 2011-05-31 23:01  oa414  阅读(451)  评论(0编辑  收藏  举报

导航