码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-14 18:55:52      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:

题意:有一些箱子,大箱子可以套小箱子,但是必须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;
}

 

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

标签:

原文地址:http://www.cnblogs.com/liuxin13/p/4730611.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!