二分图的独立数

二分图的最大独立数+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;

}

你可能感兴趣的:(二分图)