题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4160
题意:有n个套娃,问你把这些套娃组装起来,最后剩多少个套娃
解析:其实可以理解为一种最小路径覆盖,如果a能套住b,就建一条b->a的边,建完图以后,最小路径覆盖 = 顶点数-最大匹配
#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
struct doll
{
int w,l,h;
}a[maxn];
int g[maxn][maxn];
int match[maxn],vis[maxn];
int n;
bool judge(int i,int j)
{
if(a[i].w<a[j].w && a[i].l<a[j].l && a[i].h<a[j].h)
return true;
return false;
}
bool dfs(int u)
{
for(int i=0;i<n;i++)
{
if(!g[u][i]||vis[i])
continue;
vis[i] = 1;
if(match[i]==-1 || dfs(match[i]))
{
match[i] = u;
return true;
}
}
return false;
}
int main(void)
{
while(~scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
scanf("%d %d %d",&a[i].w,&a[i].l,&a[i].h);
memset(match,-1,sizeof(match));
memset(g,0,sizeof(g));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(judge(i,j))
g[i][j] = 1;
}
}
int ans = 0;
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",n-ans);
}
return 0;
}