Dolls - 4160(简单二分图匹配)

题意:有一些箱子,大箱子可以套小箱子,但是必须h>h,w>w,l>l,求出来最外面能剩下几个箱子无法被嵌套。
 
分析:思考每个箱子都只会被别的箱子套一次,所以构成一二分匹配模型,只需求出来最大的匹配,因为没有匹配的都是无法被嵌套的,已经匹配的都可以找到嵌套它的箱子,结果就是箱子总数-最大匹配。
代码如下:
=======================================================================================================================================
#include<stdio.h>
#include<string.h>

const int MAXN = 507;
const int oo = 1e9+7;

struct point{int wi, li, hi;}p[MAXN];
int G[MAXN][MAXN], Ly[MAXN], N;
bool used[MAXN];

bool OK(point a, point b)
{
    if(a.hi<b.hi && a.li<b.li && a.wi<b.wi)
        return true;
    return false;
}
bool Find(int i)
{
    for(int j=1; j<=N; j++)
    {
        if(!used[j] && G[i][j])
        {
            used[j] = true;

            if(!Ly[j] || Find(Ly[j]))
            {
                Ly[j] = i;
                return true;
            }
        }
    }

    return false;
}
int XYL()
{
    memset(Ly, 0, sizeof(Ly));
    int ans = 0;

    for(int i=1; i<=N; i++)
    {
        memset(used, false, sizeof(used));
        if(Find(i) == true)
            ans++;
    }

    return ans;
}

int main()
{
    while(scanf("%d", &N), N)
    {
        int i, j;

        memset(G, 0, sizeof(G));

        for(i=1; i<=N; i++)
            scanf("%d%d%d", &p[i].wi, &p[i].li, &p[i].hi);

        for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
        {
            if(OK(p[i], p[j]) == true)
                G[i][j] = 1;
        }

        printf("%d\n", N-XYL());
    }

    return 0;
}

 

posted @ 2015-08-14 17:14  无忧望月  阅读(193)  评论(0编辑  收藏  举报
levels of contents