您的位置:首页 > 其它

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

2015-08-14 17:14 281 查看
题意:有一些箱子,大箱子可以套小箱子,但是必须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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: