觉得浮夸了四年,漠然发现原来是浮躁了四年!

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

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

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

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

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

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

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

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

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     

 

 

posted @ 2013-04-21 21:11  heat nan  阅读(255)  评论(0编辑  收藏  举报