hdu4160

/*
分析:
    哎呀,在用C提交ac的里面竟然排第一呀,so~吃惊呀~
    最小路径覆盖,如果i可以放到j里面,那么就构建一条
i到j的有向边。


                                         2012-07-14
*/








#include"stdio.h"
#include"string.h"


struct A
{
	int total;
	int mem[555];
}E[555];
struct B
{
	int x,y,z;
}coor[555];
int match[555];
int visit[555];


int DFS(int k)
{
	int i;
	for(i=0;i<E[k].total;i++)
	{
		if(visit[E[k].mem[i]])	continue;
		visit[E[k].mem[i]]=1;
		if(match[E[k].mem[i]]==0 || DFS(match[E[k].mem[i]]))
		{
			match[E[k].mem[i]]=k;
			return 1;
		}
	}
	return 0;
}


int main()
{
	int n;
	int i,l;
	int ans;


	while(scanf("%d",&n),n)
	{
		for(i=1;i<=n;i++)
		{
			E[i].total=0;
			scanf("%d%d%d",&coor[i].x,&coor[i].y,&coor[i].z);
		}
		for(i=1;i<=n;i++)
		for(l=1;l<=n;l++)
		{
			if(i==l)	continue;
			if(coor[l].x>coor[i].x&&coor[l].y>coor[i].y&&coor[l].z>coor[i].z)
				E[i].mem[E[i].total++]=l;
		}


		ans=0;
		memset(match,0,sizeof(match));
		for(i=1;i<=n;i++)
		{
			if(E[i].total==0)	continue;
			memset(visit,0,sizeof(visit));
			ans+=DFS(i);
		}
		ans=n-ans;
		
		printf("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(hdu4160)