hdu 4160 (Dolls)二分图的最小路径覆盖

关于二分图,让人很头疼啊!归结为一句话,就是看不出来题目是二分图的问题。

也许是对二分图不太熟悉吧!需要多练习!

题目大意:给出n个箱子,每个箱子的参数为长,宽,高;(a,b,c);当且仅当箱子s1,s2满足a1<a2,b1<b2,c3<c3时箱子s1可以装入s2中,每个箱子只可以装入一个箱子(装入的箱子中可以装有箱子),问这n个箱子进行互装后,最少剩下几个箱子?

刚开始尝尽所有知道最有解的方法,排序、动态规划什么的都用上,结果都是wa。

无奈google之,发现是二分图的最小路径覆盖。

【二分图的最小路径覆盖】=总的节点数n-最大匹配数。

所以核心仍是求最大匹配数。

hdu 4160 (Dolls)二分图的最小路径覆盖 View Code
 1 #include<iostream>

 2 #include<cstring>

 3 #include<cstdio>

 4 using namespace std;

 5 #define N 555

 6 int link[N][N];

 7 int mark[N];

 8 int visited[N];

 9 struct node{

10     int a,b,c;

11 }s[N];

12 int n;

13 int dfs(int x)

14 {

15     int i;

16     for(i=1;i<=n;i++)

17     {

18         if(link[x][i]==0)  continue;

19         if(visited[i]==1)  continue;

20         {

21             visited[i]=1;

22             if(mark[i]==0||dfs(mark[i])==1)

23             {

24                 mark[i]=x;

25                 return 1;

26             }

27         }

28     }

29     return 0;

30 }

31     

32 

33 int main()

34 {

35 

36     while(cin>>n)

37     {

38         if(n==0) break;

39         int i;

40         memset(link,0,sizeof(link));

41         memset(s,0,sizeof(s));

42         memset(mark,0,sizeof(mark));

43         for(i=1;i<=n;i++)

44             cin>>s[i].a>>s[i].b>>s[i].c;

45         int j;

46         for(i=1;i<=n;i++)

47             for(j=1;j<=n;j++)

48             {

49                 if(s[i].a<s[j].a&&s[i].b<s[j].b&&s[i].c<s[j].c)

50                     link[i][j]=1;

51             }

52             int num=0;

53             for(i=1;i<=n;i++)

54             {

55                 memset(visited,0,sizeof(visited));

56                 if(dfs(i)==1)

57                     num++;

58             }

59             printf("%d\n",n-num);

60     }

61     return 0;

62 }

63 

64     

 

 

你可能感兴趣的:(HDU)